From 9ceb0c643032d095edad8151a933e50936460f4f Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Wed, 25 Apr 2018 19:04:50 +0200 Subject: [PATCH] Fix line endings Replace DOS line endings (CRLF) by standard (LF only). Signed-off-by: Stefan Weil --- src/arch/dotproductavx.h | 60 +- src/arch/dotproductsse.h | 70 +- src/arch/simddetect.cpp | 164 +- src/arch/simddetect.h | 108 +- src/ccmain/control.h | 88 +- src/ccmain/fixspace.h | 62 +- src/ccmain/mutableiterator.h | 128 +- src/ccmain/output.h | 66 +- src/ccmain/paragraphs.h | 216 +- src/ccmain/pgedit.h | 174 +- src/ccmain/reject.h | 68 +- src/ccmain/tessbox.h | 56 +- src/ccmain/tessedit.h | 58 +- src/ccmain/tessvars.cpp | 48 +- src/ccmain/tessvars.h | 54 +- src/ccmain/werdit.h | 54 +- src/ccstruct/blckerr.h | 58 +- src/ccstruct/boxword.h | 200 +- src/ccstruct/ccstruct.cpp | 72 +- src/ccstruct/ccstruct.h | 86 +- src/ccstruct/debugpixa.h | 104 +- src/ccstruct/detlinefit.cpp | 590 +- src/ccstruct/detlinefit.h | 328 +- src/ccstruct/genblob.cpp | 76 +- src/ccstruct/genblob.h | 54 +- src/ccstruct/hpdsizes.h | 34 +- src/ccstruct/ocrpara.cpp | 200 +- src/ccstruct/otsuthr.h | 112 +- src/ccstruct/params_training_featdef.h | 298 +- src/ccstruct/polyaprx.h | 88 +- src/ccstruct/publictypes.cpp | 80 +- src/ccstruct/quadlsq.cpp | 286 +- src/ccstruct/vecfuncs.cpp | 126 +- src/ccstruct/vecfuncs.h | 156 +- src/ccutil/basedir.h | 62 +- src/ccutil/errcode.h | 206 +- src/ccutil/fileerr.h | 68 +- src/ccutil/globaloc.h | 78 +- src/ccutil/ndminx.h | 62 +- src/ccutil/qrsequence.h | 160 +- src/ccutil/scanutils.h | 134 +- src/ccutil/stderr.h | 52 +- src/ccutil/tprintf.h | 72 +- src/ccutil/unicharmap.h | 146 +- src/ccutil/unicodes.h | 78 +- src/ccutil/universalambigs.cpp | 38042 +++++++++++------------ src/ccutil/universalambigs.h | 62 +- src/classify/blobclass.h | 100 +- src/classify/float2int.h | 60 +- src/classify/fpoint.cpp | 122 +- src/classify/fpoint.h | 108 +- src/classify/intfeaturedist.h | 160 +- src/classify/intfeaturemap.h | 326 +- src/classify/mf.h | 78 +- src/classify/mfdefs.cpp | 100 +- src/classify/mfdefs.h | 112 +- src/classify/mfoutline.h | 248 +- src/classify/mfx.h | 82 +- src/classify/normfeat.cpp | 150 +- src/classify/normfeat.h | 78 +- src/classify/normmatch.h | 74 +- src/classify/ocrfeatures.cpp | 488 +- src/classify/outfeat.h | 96 +- src/classify/picofeat.h | 130 +- src/cutil/const.h | 46 +- src/cutil/cutil.h | 230 +- src/cutil/cutil_class.cpp | 58 +- src/cutil/cutil_class.h | 74 +- src/cutil/danerror.h | 70 +- src/cutil/efio.h | 64 +- src/cutil/emalloc.h | 88 +- src/cutil/globals.h | 70 +- src/cutil/oldlist.h | 708 +- src/cutil/structures.cpp | 72 +- src/cutil/structures.h | 126 +- src/dict/context.cpp | 164 +- src/dict/dawg_cache.cpp | 194 +- src/dict/dawg_cache.h | 106 +- src/lstm/convolve.cpp | 238 +- src/lstm/ctc.cpp | 824 +- src/lstm/ctc.h | 260 +- src/lstm/functions.cpp | 52 +- src/lstm/functions.h | 498 +- src/lstm/input.h | 210 +- src/lstm/maxpool.cpp | 172 +- src/lstm/maxpool.h | 140 +- src/lstm/networkbuilder.h | 320 +- src/lstm/parallel.h | 174 +- src/lstm/reconfig.cpp | 246 +- src/lstm/reversed.h | 178 +- src/lstm/static_shape.h | 160 +- src/lstm/stridemap.cpp | 348 +- src/lstm/stridemap.h | 274 +- src/lstm/tfnetwork.cpp | 296 +- src/lstm/tfnetwork.h | 180 +- src/lstm/tfnetwork.proto | 122 +- src/opencl/Makefile.am | 16 +- src/opencl/oclkernels.h | 2146 +- src/opencl/opencl_device_selection.h | 92 +- src/opencl/openclwrapper.cpp | 5458 ++-- src/opencl/openclwrapper.h | 586 +- src/textord/baselinedetect.h | 554 +- src/textord/blobgrid.cpp | 88 +- src/textord/blobgrid.h | 92 +- src/textord/cjkpitch.h | 142 +- src/textord/drawedg.cpp | 166 +- src/textord/drawedg.h | 74 +- src/textord/equationdetectbase.h | 118 +- src/textord/strokewidth.h | 710 +- src/textord/tablefind.h | 860 +- src/textord/tordmain.h | 84 +- src/textord/tovars.cpp | 166 +- src/textord/tovars.h | 178 +- src/textord/underlin.h | 104 +- src/training/degradeimage.cpp | 620 +- src/training/degradeimage.h | 122 +- src/training/icuerrorcode.h | 132 +- src/training/mergenf.cpp | 706 +- src/training/mergenf.h | 206 +- src/training/tlog.cpp | 46 +- src/training/tlog.h | 82 +- src/training/validate_grapheme.h | 70 +- src/training/validate_indic.h | 88 +- src/training/validate_khmer.cpp | 212 +- src/training/validate_khmer.h | 54 +- src/training/validate_myanmar.cpp | 320 +- src/training/validate_myanmar.h | 94 +- src/training/validator.h | 486 +- src/viewer/Makefile.am | 28 +- src/viewer/svmnode.h | 192 +- src/viewer/svpaint.cpp | 470 +- src/vs2010/port/gettimeofday.h | 62 +- src/vs2010/tesseract/resource.h | 46 +- src/vs2010/tesseract/tesseract.rc.in | 202 +- src/wordrec/chop.h | 88 +- src/wordrec/drawfx.h | 64 +- src/wordrec/findseam.h | 88 +- src/wordrec/gradechop.cpp | 180 +- src/wordrec/gradechop.h | 100 +- src/wordrec/lm_pain_points.h | 276 +- src/wordrec/measure.h | 254 +- src/wordrec/outlines.h | 268 +- src/wordrec/params_model.cpp | 342 +- src/wordrec/params_model.h | 178 +- src/wordrec/plotedges.h | 138 +- src/wordrec/render.h | 118 +- 146 files changed, 35442 insertions(+), 35442 deletions(-) diff --git a/src/arch/dotproductavx.h b/src/arch/dotproductavx.h index 14d024204e..ef00cdfb11 100644 --- a/src/arch/dotproductavx.h +++ b/src/arch/dotproductavx.h @@ -1,30 +1,30 @@ -/////////////////////////////////////////////////////////////////////// -// File: dotproductavx.h -// Description: Architecture-specific dot-product function. -// Author: Ray Smith -// Created: Wed Jul 22 10:51:05 PDT 2015 -// -// (C) Copyright 2015, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -/////////////////////////////////////////////////////////////////////// - -#ifndef TESSERACT_ARCH_DOTPRODUCTAVX_H_ -#define TESSERACT_ARCH_DOTPRODUCTAVX_H_ - -namespace tesseract { - -// Computes and returns the dot product of the n-vectors u and v. -// Uses Intel AVX intrinsics to access the SIMD instruction set. -double DotProductAVX(const double* u, const double* v, int n); - -} // namespace tesseract. - -#endif // TESSERACT_ARCH_DOTPRODUCTAVX_H_ +/////////////////////////////////////////////////////////////////////// +// File: dotproductavx.h +// Description: Architecture-specific dot-product function. +// Author: Ray Smith +// Created: Wed Jul 22 10:51:05 PDT 2015 +// +// (C) Copyright 2015, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +/////////////////////////////////////////////////////////////////////// + +#ifndef TESSERACT_ARCH_DOTPRODUCTAVX_H_ +#define TESSERACT_ARCH_DOTPRODUCTAVX_H_ + +namespace tesseract { + +// Computes and returns the dot product of the n-vectors u and v. +// Uses Intel AVX intrinsics to access the SIMD instruction set. +double DotProductAVX(const double* u, const double* v, int n); + +} // namespace tesseract. + +#endif // TESSERACT_ARCH_DOTPRODUCTAVX_H_ diff --git a/src/arch/dotproductsse.h b/src/arch/dotproductsse.h index 0f21f0b483..a654669399 100644 --- a/src/arch/dotproductsse.h +++ b/src/arch/dotproductsse.h @@ -1,35 +1,35 @@ -/////////////////////////////////////////////////////////////////////// -// File: dotproductsse.h -// Description: Architecture-specific dot-product function. -// Author: Ray Smith -// Created: Wed Jul 22 10:57:05 PDT 2015 -// -// (C) Copyright 2015, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -/////////////////////////////////////////////////////////////////////// - -#ifndef TESSERACT_ARCH_DOTPRODUCTSSE_H_ -#define TESSERACT_ARCH_DOTPRODUCTSSE_H_ - -#include "host.h" - -namespace tesseract { - -// Computes and returns the dot product of the n-vectors u and v. -// Uses Intel SSE intrinsics to access the SIMD instruction set. -double DotProductSSE(const double* u, const double* v, int n); -// Computes and returns the dot product of the n-vectors u and v. -// Uses Intel SSE intrinsics to access the SIMD instruction set. -int32_t IntDotProductSSE(const int8_t* u, const int8_t* v, int n); - -} // namespace tesseract. - -#endif // TESSERACT_ARCH_DOTPRODUCTSSE_H_ +/////////////////////////////////////////////////////////////////////// +// File: dotproductsse.h +// Description: Architecture-specific dot-product function. +// Author: Ray Smith +// Created: Wed Jul 22 10:57:05 PDT 2015 +// +// (C) Copyright 2015, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +/////////////////////////////////////////////////////////////////////// + +#ifndef TESSERACT_ARCH_DOTPRODUCTSSE_H_ +#define TESSERACT_ARCH_DOTPRODUCTSSE_H_ + +#include "host.h" + +namespace tesseract { + +// Computes and returns the dot product of the n-vectors u and v. +// Uses Intel SSE intrinsics to access the SIMD instruction set. +double DotProductSSE(const double* u, const double* v, int n); +// Computes and returns the dot product of the n-vectors u and v. +// Uses Intel SSE intrinsics to access the SIMD instruction set. +int32_t IntDotProductSSE(const int8_t* u, const int8_t* v, int n); + +} // namespace tesseract. + +#endif // TESSERACT_ARCH_DOTPRODUCTSSE_H_ diff --git a/src/arch/simddetect.cpp b/src/arch/simddetect.cpp index ad6177815f..697100bbf1 100644 --- a/src/arch/simddetect.cpp +++ b/src/arch/simddetect.cpp @@ -1,82 +1,82 @@ -/////////////////////////////////////////////////////////////////////// -// File: simddetect.cpp -// Description: Architecture detector. -// Author: Stefan Weil (based on code from Ray Smith) -// -// (C) Copyright 2014, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -/////////////////////////////////////////////////////////////////////// - -#include "simddetect.h" -#include "tprintf.h" - -#undef X86_BUILD -#if defined(__x86_64__) || defined(__i386__) || defined(_WIN32) -#if !defined(ANDROID_BUILD) -#define X86_BUILD 1 -#endif // !ANDROID_BUILD -#endif // x86 target - -#if defined(X86_BUILD) -#if defined(__GNUC__) -#include -#elif defined(_WIN32) -#include -#endif -#endif - -SIMDDetect SIMDDetect::detector; - -// If true, then AVX has been detected. -bool SIMDDetect::avx_available_; -bool SIMDDetect::avx2_available_; -bool SIMDDetect::avx512F_available_; -bool SIMDDetect::avx512BW_available_; -// If true, then SSe4.1 has been detected. -bool SIMDDetect::sse_available_; - -// Constructor. -// Tests the architecture in a system-dependent way to detect AVX, SSE and -// any other available SIMD equipment. -// __GNUC__ is also defined by compilers that include GNU extensions such as -// clang. -SIMDDetect::SIMDDetect() { -#if defined(X86_BUILD) -#if defined(__GNUC__) - unsigned int eax, ebx, ecx, edx; - if (__get_cpuid(1, &eax, &ebx, &ecx, &edx) != 0) { - // Note that these tests all use hex because the older compilers don't have - // the newer flags. - sse_available_ = (ecx & 0x00080000) != 0; - avx_available_ = (ecx & 0x10000000) != 0; - if (avx_available_) { - // There is supposed to be a __get_cpuid_count function, but this is all - // there is in my cpuid.h. It is a macro for an asm statement and cannot - // be used inside an if. - __cpuid_count(7, 0, eax, ebx, ecx, edx); - avx2_available_ = (ebx & 0x00000020) != 0; - avx512F_available_ = (ebx & 0x00010000) != 0; - avx512BW_available_ = (ebx & 0x40000000) != 0; - } - } -#elif defined(_WIN32) - int cpuInfo[4]; - __cpuid(cpuInfo, 0); - if (cpuInfo[0] >= 1) { - __cpuid(cpuInfo, 1); - sse_available_ = (cpuInfo[2] & 0x00080000) != 0; - avx_available_ = (cpuInfo[2] & 0x10000000) != 0; - } -#else -#error "I don't know how to test for SIMD with this compiler" -#endif -#endif // X86_BUILD -} +/////////////////////////////////////////////////////////////////////// +// File: simddetect.cpp +// Description: Architecture detector. +// Author: Stefan Weil (based on code from Ray Smith) +// +// (C) Copyright 2014, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +/////////////////////////////////////////////////////////////////////// + +#include "simddetect.h" +#include "tprintf.h" + +#undef X86_BUILD +#if defined(__x86_64__) || defined(__i386__) || defined(_WIN32) +#if !defined(ANDROID_BUILD) +#define X86_BUILD 1 +#endif // !ANDROID_BUILD +#endif // x86 target + +#if defined(X86_BUILD) +#if defined(__GNUC__) +#include +#elif defined(_WIN32) +#include +#endif +#endif + +SIMDDetect SIMDDetect::detector; + +// If true, then AVX has been detected. +bool SIMDDetect::avx_available_; +bool SIMDDetect::avx2_available_; +bool SIMDDetect::avx512F_available_; +bool SIMDDetect::avx512BW_available_; +// If true, then SSe4.1 has been detected. +bool SIMDDetect::sse_available_; + +// Constructor. +// Tests the architecture in a system-dependent way to detect AVX, SSE and +// any other available SIMD equipment. +// __GNUC__ is also defined by compilers that include GNU extensions such as +// clang. +SIMDDetect::SIMDDetect() { +#if defined(X86_BUILD) +#if defined(__GNUC__) + unsigned int eax, ebx, ecx, edx; + if (__get_cpuid(1, &eax, &ebx, &ecx, &edx) != 0) { + // Note that these tests all use hex because the older compilers don't have + // the newer flags. + sse_available_ = (ecx & 0x00080000) != 0; + avx_available_ = (ecx & 0x10000000) != 0; + if (avx_available_) { + // There is supposed to be a __get_cpuid_count function, but this is all + // there is in my cpuid.h. It is a macro for an asm statement and cannot + // be used inside an if. + __cpuid_count(7, 0, eax, ebx, ecx, edx); + avx2_available_ = (ebx & 0x00000020) != 0; + avx512F_available_ = (ebx & 0x00010000) != 0; + avx512BW_available_ = (ebx & 0x40000000) != 0; + } + } +#elif defined(_WIN32) + int cpuInfo[4]; + __cpuid(cpuInfo, 0); + if (cpuInfo[0] >= 1) { + __cpuid(cpuInfo, 1); + sse_available_ = (cpuInfo[2] & 0x00080000) != 0; + avx_available_ = (cpuInfo[2] & 0x10000000) != 0; + } +#else +#error "I don't know how to test for SIMD with this compiler" +#endif +#endif // X86_BUILD +} diff --git a/src/arch/simddetect.h b/src/arch/simddetect.h index de7a4b41e0..ca30d180c9 100644 --- a/src/arch/simddetect.h +++ b/src/arch/simddetect.h @@ -1,54 +1,54 @@ -/////////////////////////////////////////////////////////////////////// -// File: simddetect.h -// Description: Architecture detector. -// Author: Stefan Weil (based on code from Ray Smith) -// -// (C) Copyright 2014, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -/////////////////////////////////////////////////////////////////////// - -#include "platform.h" - -// Architecture detector. Add code here to detect any other architectures for -// SIMD-based faster dot product functions. Intended to be a single static -// object, but it does no real harm to have more than one. -class SIMDDetect { - public: - // Returns true if AVX is available on this system. - static inline bool IsAVXAvailable() { return detector.avx_available_; } - // Returns true if AVX2 (integer support) is available on this system. - static inline bool IsAVX2Available() { return detector.avx2_available_; } - // Returns true if AVX512 Foundation (float) is available on this system. - static inline bool IsAVX512FAvailable() { - return detector.avx512F_available_; - } - // Returns true if AVX512 integer is available on this system. - static inline bool IsAVX512BWAvailable() { - return detector.avx512BW_available_; - } - // Returns true if SSE4.1 is available on this system. - static inline bool IsSSEAvailable() { return detector.sse_available_; } - - private: - // Constructor, must set all static member variables. - SIMDDetect(); - - private: - // Singleton. - static SIMDDetect detector; - // If true, then AVX has been detected. - static TESS_API bool avx_available_; - static TESS_API bool avx2_available_; - static TESS_API bool avx512F_available_; - static TESS_API bool avx512BW_available_; - // If true, then SSe4.1 has been detected. - static TESS_API bool sse_available_; -}; +/////////////////////////////////////////////////////////////////////// +// File: simddetect.h +// Description: Architecture detector. +// Author: Stefan Weil (based on code from Ray Smith) +// +// (C) Copyright 2014, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +/////////////////////////////////////////////////////////////////////// + +#include "platform.h" + +// Architecture detector. Add code here to detect any other architectures for +// SIMD-based faster dot product functions. Intended to be a single static +// object, but it does no real harm to have more than one. +class SIMDDetect { + public: + // Returns true if AVX is available on this system. + static inline bool IsAVXAvailable() { return detector.avx_available_; } + // Returns true if AVX2 (integer support) is available on this system. + static inline bool IsAVX2Available() { return detector.avx2_available_; } + // Returns true if AVX512 Foundation (float) is available on this system. + static inline bool IsAVX512FAvailable() { + return detector.avx512F_available_; + } + // Returns true if AVX512 integer is available on this system. + static inline bool IsAVX512BWAvailable() { + return detector.avx512BW_available_; + } + // Returns true if SSE4.1 is available on this system. + static inline bool IsSSEAvailable() { return detector.sse_available_; } + + private: + // Constructor, must set all static member variables. + SIMDDetect(); + + private: + // Singleton. + static SIMDDetect detector; + // If true, then AVX has been detected. + static TESS_API bool avx_available_; + static TESS_API bool avx2_available_; + static TESS_API bool avx512F_available_; + static TESS_API bool avx512BW_available_; + // If true, then SSe4.1 has been detected. + static TESS_API bool sse_available_; +}; diff --git a/src/ccmain/control.h b/src/ccmain/control.h index 760b256154..2f76a47cea 100644 --- a/src/ccmain/control.h +++ b/src/ccmain/control.h @@ -1,44 +1,44 @@ -/********************************************************************** - * File: control.h (Formerly control.h) - * Description: Module-independent matcher controller. - * Author: Ray Smith - * Created: Thu Apr 23 11:09:58 BST 1992 - * - * (C) Copyright 1992, Hewlett-Packard Ltd. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -/** - * @file control.h - * Module-independent matcher controller. - */ - -#ifndef CONTROL_H -#define CONTROL_H - -#include "params.h" -#include "ocrblock.h" -#include "ratngs.h" -#include "statistc.h" -#include "pageres.h" - -enum ACCEPTABLE_WERD_TYPE -{ - AC_UNACCEPTABLE, ///< Unacceptable word - AC_LOWER_CASE, ///< ALL lower case - AC_UPPER_CASE, ///< ALL upper case - AC_INITIAL_CAP, ///< ALL but initial lc - AC_LC_ABBREV, ///< a.b.c. - AC_UC_ABBREV ///< A.B.C. -}; - -#endif +/********************************************************************** + * File: control.h (Formerly control.h) + * Description: Module-independent matcher controller. + * Author: Ray Smith + * Created: Thu Apr 23 11:09:58 BST 1992 + * + * (C) Copyright 1992, Hewlett-Packard Ltd. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +/** + * @file control.h + * Module-independent matcher controller. + */ + +#ifndef CONTROL_H +#define CONTROL_H + +#include "params.h" +#include "ocrblock.h" +#include "ratngs.h" +#include "statistc.h" +#include "pageres.h" + +enum ACCEPTABLE_WERD_TYPE +{ + AC_UNACCEPTABLE, ///< Unacceptable word + AC_LOWER_CASE, ///< ALL lower case + AC_UPPER_CASE, ///< ALL upper case + AC_INITIAL_CAP, ///< ALL but initial lc + AC_LC_ABBREV, ///< a.b.c. + AC_UC_ABBREV ///< A.B.C. +}; + +#endif diff --git a/src/ccmain/fixspace.h b/src/ccmain/fixspace.h index e5cbb6a4cb..5233bda275 100644 --- a/src/ccmain/fixspace.h +++ b/src/ccmain/fixspace.h @@ -1,31 +1,31 @@ -/****************************************************************** - * File: fixspace.h (Formerly fixspace.h) - * Description: Implements a pass over the page res, exploring the alternative - * spacing possibilities, trying to use context to improve the - word spacing -* Author: Phil Cheatle -* Created: Thu Oct 21 11:38:43 BST 1993 -* -* (C) Copyright 1993, Hewlett-Packard Ltd. -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** http://www.apache.org/licenses/LICENSE-2.0 -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -* -**********************************************************************/ - -#ifndef FIXSPACE_H -#define FIXSPACE_H - -#include "pageres.h" -#include "params.h" - -void initialise_search(WERD_RES_LIST &src_list, WERD_RES_LIST &new_list); -void transform_to_next_perm(WERD_RES_LIST &words); -void fixspace_dbg(WERD_RES *word); -#endif +/****************************************************************** + * File: fixspace.h (Formerly fixspace.h) + * Description: Implements a pass over the page res, exploring the alternative + * spacing possibilities, trying to use context to improve the + word spacing +* Author: Phil Cheatle +* Created: Thu Oct 21 11:38:43 BST 1993 +* +* (C) Copyright 1993, Hewlett-Packard Ltd. +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** http://www.apache.org/licenses/LICENSE-2.0 +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +* +**********************************************************************/ + +#ifndef FIXSPACE_H +#define FIXSPACE_H + +#include "pageres.h" +#include "params.h" + +void initialise_search(WERD_RES_LIST &src_list, WERD_RES_LIST &new_list); +void transform_to_next_perm(WERD_RES_LIST &words); +void fixspace_dbg(WERD_RES *word); +#endif diff --git a/src/ccmain/mutableiterator.h b/src/ccmain/mutableiterator.h index 2da61c1dab..54759ba429 100644 --- a/src/ccmain/mutableiterator.h +++ b/src/ccmain/mutableiterator.h @@ -1,64 +1,64 @@ -/////////////////////////////////////////////////////////////////////// -// File: mutableiterator.h -// Description: Iterator for tesseract results providing access to -// both high-level API and Tesseract internal data structures. -// Author: David Eger -// Created: Thu Feb 24 19:01:06 PST 2011 -// -// (C) Copyright 2011, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -#ifndef TESSERACT_CCMAIN_MUTABLEITERATOR_H_ -#define TESSERACT_CCMAIN_MUTABLEITERATOR_H_ - -#include "resultiterator.h" - -class BLOB_CHOICE_IT; - -namespace tesseract { - -class Tesseract; - -// Class to iterate over tesseract results, providing access to all levels -// of the page hierarchy, without including any tesseract headers or having -// to handle any tesseract structures. -// WARNING! This class points to data held within the TessBaseAPI class, and -// therefore can only be used while the TessBaseAPI class still exists and -// has not been subjected to a call of Init, SetImage, Recognize, Clear, End -// DetectOS, or anything else that changes the internal PAGE_RES. -// See apitypes.h for the definition of PageIteratorLevel. -// See also base class PageIterator, which contains the bulk of the interface. -// ResultIterator adds text-specific methods for access to OCR output. -// MutableIterator adds access to internal data structures. - -class MutableIterator : public ResultIterator { - public: - // See argument descriptions in ResultIterator() - MutableIterator(PAGE_RES* page_res, Tesseract* tesseract, - int scale, int scaled_yres, - int rect_left, int rect_top, - int rect_width, int rect_height) - : ResultIterator( - LTRResultIterator(page_res, tesseract, scale, scaled_yres, rect_left, - rect_top, rect_width, rect_height)) {} - virtual ~MutableIterator() {} - - // See PageIterator and ResultIterator for most calls. - - // Return access to Tesseract internals. - const PAGE_RES_IT *PageResIt() const { return it_; } -}; - -} // namespace tesseract. - -#endif // TESSERACT_CCMAIN_MUTABLEITERATOR_H_ +/////////////////////////////////////////////////////////////////////// +// File: mutableiterator.h +// Description: Iterator for tesseract results providing access to +// both high-level API and Tesseract internal data structures. +// Author: David Eger +// Created: Thu Feb 24 19:01:06 PST 2011 +// +// (C) Copyright 2011, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +#ifndef TESSERACT_CCMAIN_MUTABLEITERATOR_H_ +#define TESSERACT_CCMAIN_MUTABLEITERATOR_H_ + +#include "resultiterator.h" + +class BLOB_CHOICE_IT; + +namespace tesseract { + +class Tesseract; + +// Class to iterate over tesseract results, providing access to all levels +// of the page hierarchy, without including any tesseract headers or having +// to handle any tesseract structures. +// WARNING! This class points to data held within the TessBaseAPI class, and +// therefore can only be used while the TessBaseAPI class still exists and +// has not been subjected to a call of Init, SetImage, Recognize, Clear, End +// DetectOS, or anything else that changes the internal PAGE_RES. +// See apitypes.h for the definition of PageIteratorLevel. +// See also base class PageIterator, which contains the bulk of the interface. +// ResultIterator adds text-specific methods for access to OCR output. +// MutableIterator adds access to internal data structures. + +class MutableIterator : public ResultIterator { + public: + // See argument descriptions in ResultIterator() + MutableIterator(PAGE_RES* page_res, Tesseract* tesseract, + int scale, int scaled_yres, + int rect_left, int rect_top, + int rect_width, int rect_height) + : ResultIterator( + LTRResultIterator(page_res, tesseract, scale, scaled_yres, rect_left, + rect_top, rect_width, rect_height)) {} + virtual ~MutableIterator() {} + + // See PageIterator and ResultIterator for most calls. + + // Return access to Tesseract internals. + const PAGE_RES_IT *PageResIt() const { return it_; } +}; + +} // namespace tesseract. + +#endif // TESSERACT_CCMAIN_MUTABLEITERATOR_H_ diff --git a/src/ccmain/output.h b/src/ccmain/output.h index 4f22958683..7f297c932b 100644 --- a/src/ccmain/output.h +++ b/src/ccmain/output.h @@ -1,33 +1,33 @@ -/****************************************************************** - * File: output.h (Formerly output.h) - * Description: Output pass - * Author: Phil Cheatle - * Created: Thu Aug 4 10:56:08 BST 1994 - * - * (C) Copyright 1994, Hewlett-Packard Ltd. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -#ifndef OUTPUT_H -#define OUTPUT_H - -#include "params.h" -//#include "epapconv.h" -#include "pageres.h" - -/** test line ends */ -char determine_newline_type(WERD *word, ///< word to do - BLOCK *block, ///< current block - WERD *next_word, ///< next word - BLOCK *next_block ///< block of next word - ); -#endif +/****************************************************************** + * File: output.h (Formerly output.h) + * Description: Output pass + * Author: Phil Cheatle + * Created: Thu Aug 4 10:56:08 BST 1994 + * + * (C) Copyright 1994, Hewlett-Packard Ltd. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +#ifndef OUTPUT_H +#define OUTPUT_H + +#include "params.h" +//#include "epapconv.h" +#include "pageres.h" + +/** test line ends */ +char determine_newline_type(WERD *word, ///< word to do + BLOCK *block, ///< current block + WERD *next_word, ///< next word + BLOCK *next_block ///< block of next word + ); +#endif diff --git a/src/ccmain/paragraphs.h b/src/ccmain/paragraphs.h index 03820eefc7..e92ff3b150 100644 --- a/src/ccmain/paragraphs.h +++ b/src/ccmain/paragraphs.h @@ -1,108 +1,108 @@ -/********************************************************************** - * File: paragraphs.h - * Description: Paragraph Detection data structures. - * Author: David Eger - * Created: 25 February 2011 - * - * (C) Copyright 2011, Google Inc. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -#ifndef TESSERACT_CCMAIN_PARAGRAPHS_H_ -#define TESSERACT_CCMAIN_PARAGRAPHS_H_ - -#include "rect.h" -#include "ocrpara.h" -#include "genericvector.h" -#include "strngs.h" - - -class WERD; -class UNICHARSET; - -namespace tesseract { - -class MutableIterator; - -// This structure captures all information needed about a text line for the -// purposes of paragraph detection. It is meant to be exceedingly light-weight -// so that we can easily test paragraph detection independent of the rest of -// Tesseract. -class RowInfo { - public: - // Constant data derived from Tesseract output. - STRING text; // the full UTF-8 text of the line. - bool ltr; // whether the majority of the text is left-to-right - // TODO(eger) make this more fine-grained. - - bool has_leaders; // does the line contain leader dots (.....)? - bool has_drop_cap; // does the line have a drop cap? - int pix_ldistance; // distance to the left pblock boundary in pixels - int pix_rdistance; // distance to the right pblock boundary in pixels - float pix_xheight; // guessed xheight for the line - int average_interword_space; // average space between words in pixels. - - int num_words; - TBOX lword_box; // in normalized (horiz text rows) space - TBOX rword_box; // in normalized (horiz text rows) space - - STRING lword_text; // the UTF-8 text of the leftmost werd - STRING rword_text; // the UTF-8 text of the rightmost werd - - // The text of a paragraph typically starts with the start of an idea and - // ends with the end of an idea. Here we define paragraph as something that - // may have a first line indent and a body indent which may be different. - // Typical words that start an idea are: - // 1. Words in western scripts that start with - // a capital letter, for example "The" - // 2. Bulleted or numbered list items, for - // example "2." - // Typical words which end an idea are words ending in punctuation marks. In - // this vocabulary, each list item is represented as a paragraph. - bool lword_indicates_list_item; - bool lword_likely_starts_idea; - bool lword_likely_ends_idea; - - bool rword_indicates_list_item; - bool rword_likely_starts_idea; - bool rword_likely_ends_idea; -}; - -// Main entry point for Paragraph Detection Algorithm. -// -// Given a set of equally spaced textlines (described by row_infos), -// Split them into paragraphs. See http://goto/paragraphstalk -// -// Output: -// row_owners - one pointer for each row, to the paragraph it belongs to. -// paragraphs - this is the actual list of PARA objects. -// models - the list of paragraph models referenced by the PARA objects. -// caller is responsible for deleting the models. -void DetectParagraphs(int debug_level, - GenericVector *row_infos, - GenericVector *row_owners, - PARA_LIST *paragraphs, - GenericVector *models); - -// Given a MutableIterator to the start of a block, run DetectParagraphs on -// that block and commit the results to the underlying ROW and BLOCK structs, -// saving the ParagraphModels in models. Caller owns the models. -// We use unicharset during the function to answer questions such as "is the -// first letter of this word upper case?" -void DetectParagraphs(int debug_level, - bool after_text_recognition, - const MutableIterator *block_start, - GenericVector *models); - -} // namespace - -#endif // TESSERACT_CCMAIN_PARAGRAPHS_H_ +/********************************************************************** + * File: paragraphs.h + * Description: Paragraph Detection data structures. + * Author: David Eger + * Created: 25 February 2011 + * + * (C) Copyright 2011, Google Inc. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +#ifndef TESSERACT_CCMAIN_PARAGRAPHS_H_ +#define TESSERACT_CCMAIN_PARAGRAPHS_H_ + +#include "rect.h" +#include "ocrpara.h" +#include "genericvector.h" +#include "strngs.h" + + +class WERD; +class UNICHARSET; + +namespace tesseract { + +class MutableIterator; + +// This structure captures all information needed about a text line for the +// purposes of paragraph detection. It is meant to be exceedingly light-weight +// so that we can easily test paragraph detection independent of the rest of +// Tesseract. +class RowInfo { + public: + // Constant data derived from Tesseract output. + STRING text; // the full UTF-8 text of the line. + bool ltr; // whether the majority of the text is left-to-right + // TODO(eger) make this more fine-grained. + + bool has_leaders; // does the line contain leader dots (.....)? + bool has_drop_cap; // does the line have a drop cap? + int pix_ldistance; // distance to the left pblock boundary in pixels + int pix_rdistance; // distance to the right pblock boundary in pixels + float pix_xheight; // guessed xheight for the line + int average_interword_space; // average space between words in pixels. + + int num_words; + TBOX lword_box; // in normalized (horiz text rows) space + TBOX rword_box; // in normalized (horiz text rows) space + + STRING lword_text; // the UTF-8 text of the leftmost werd + STRING rword_text; // the UTF-8 text of the rightmost werd + + // The text of a paragraph typically starts with the start of an idea and + // ends with the end of an idea. Here we define paragraph as something that + // may have a first line indent and a body indent which may be different. + // Typical words that start an idea are: + // 1. Words in western scripts that start with + // a capital letter, for example "The" + // 2. Bulleted or numbered list items, for + // example "2." + // Typical words which end an idea are words ending in punctuation marks. In + // this vocabulary, each list item is represented as a paragraph. + bool lword_indicates_list_item; + bool lword_likely_starts_idea; + bool lword_likely_ends_idea; + + bool rword_indicates_list_item; + bool rword_likely_starts_idea; + bool rword_likely_ends_idea; +}; + +// Main entry point for Paragraph Detection Algorithm. +// +// Given a set of equally spaced textlines (described by row_infos), +// Split them into paragraphs. See http://goto/paragraphstalk +// +// Output: +// row_owners - one pointer for each row, to the paragraph it belongs to. +// paragraphs - this is the actual list of PARA objects. +// models - the list of paragraph models referenced by the PARA objects. +// caller is responsible for deleting the models. +void DetectParagraphs(int debug_level, + GenericVector *row_infos, + GenericVector *row_owners, + PARA_LIST *paragraphs, + GenericVector *models); + +// Given a MutableIterator to the start of a block, run DetectParagraphs on +// that block and commit the results to the underlying ROW and BLOCK structs, +// saving the ParagraphModels in models. Caller owns the models. +// We use unicharset during the function to answer questions such as "is the +// first letter of this word upper case?" +void DetectParagraphs(int debug_level, + bool after_text_recognition, + const MutableIterator *block_start, + GenericVector *models); + +} // namespace + +#endif // TESSERACT_CCMAIN_PARAGRAPHS_H_ diff --git a/src/ccmain/pgedit.h b/src/ccmain/pgedit.h index 2a214e7786..e9fc693679 100644 --- a/src/ccmain/pgedit.h +++ b/src/ccmain/pgedit.h @@ -1,87 +1,87 @@ -/////////////////////////////////////////////////////////////////////// -// File: pgedit.h -// Description: Page structure file editor -// Author: Joern Wanke -// Created: Wed Jul 18 10:05:01 PDT 2007 -// -// (C) Copyright 2007, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -#ifndef PGEDIT_H -#define PGEDIT_H - -#include "ocrblock.h" -#include "ocrrow.h" -#include "werd.h" -#include "rect.h" -#include "params.h" -#include "tesseractclass.h" - -class ScrollView; -class SVMenuNode; -struct SVEvent; - -// A small event handler class to process incoming events to -// this window. -class PGEventHandler : public SVEventHandler { - public: - PGEventHandler(tesseract::Tesseract* tess) : tess_(tess) { - } - void Notify(const SVEvent* sve); - private: - tesseract::Tesseract* tess_; -}; - -extern BLOCK_LIST *current_block_list; -extern STRING_VAR_H (editor_image_win_name, "EditorImage", -"Editor image window name"); -extern INT_VAR_H (editor_image_xpos, 590, "Editor image X Pos"); -extern INT_VAR_H (editor_image_ypos, 10, "Editor image Y Pos"); -extern INT_VAR_H (editor_image_height, 680, "Editor image height"); -extern INT_VAR_H (editor_image_width, 655, "Editor image width"); -extern INT_VAR_H (editor_image_word_bb_color, BLUE, -"Word bounding box colour"); -extern INT_VAR_H (editor_image_blob_bb_color, YELLOW, -"Blob bounding box colour"); -extern INT_VAR_H (editor_image_text_color, WHITE, "Correct text colour"); -extern STRING_VAR_H (editor_dbwin_name, "EditorDBWin", -"Editor debug window name"); -extern INT_VAR_H (editor_dbwin_xpos, 50, "Editor debug window X Pos"); -extern INT_VAR_H (editor_dbwin_ypos, 500, "Editor debug window Y Pos"); -extern INT_VAR_H (editor_dbwin_height, 24, "Editor debug window height"); -extern INT_VAR_H (editor_dbwin_width, 80, "Editor debug window width"); -extern STRING_VAR_H (editor_word_name, "BlnWords", -"BL normalised word window"); -extern INT_VAR_H (editor_word_xpos, 60, "Word window X Pos"); -extern INT_VAR_H (editor_word_ypos, 510, "Word window Y Pos"); -extern INT_VAR_H (editor_word_height, 240, "Word window height"); -extern INT_VAR_H (editor_word_width, 655, "Word window width"); -extern double_VAR_H (editor_smd_scale_factor, 1.0, "Scaling for smd image"); - -ScrollView* bln_word_window_handle(); //return handle -void build_image_window(int width, int height); -void display_bln_lines(ScrollView window, - ScrollView::Color colour, - float scale_factor, - float y_offset, - float minx, - float maxx); - //function to call -void pgeditor_msg( //message display - const char *msg); -void pgeditor_show_point( //display coords - SVEvent *event); - //put bln word in box -void show_point(PAGE_RES* page_res, float x, float y); - -#endif +/////////////////////////////////////////////////////////////////////// +// File: pgedit.h +// Description: Page structure file editor +// Author: Joern Wanke +// Created: Wed Jul 18 10:05:01 PDT 2007 +// +// (C) Copyright 2007, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +#ifndef PGEDIT_H +#define PGEDIT_H + +#include "ocrblock.h" +#include "ocrrow.h" +#include "werd.h" +#include "rect.h" +#include "params.h" +#include "tesseractclass.h" + +class ScrollView; +class SVMenuNode; +struct SVEvent; + +// A small event handler class to process incoming events to +// this window. +class PGEventHandler : public SVEventHandler { + public: + PGEventHandler(tesseract::Tesseract* tess) : tess_(tess) { + } + void Notify(const SVEvent* sve); + private: + tesseract::Tesseract* tess_; +}; + +extern BLOCK_LIST *current_block_list; +extern STRING_VAR_H (editor_image_win_name, "EditorImage", +"Editor image window name"); +extern INT_VAR_H (editor_image_xpos, 590, "Editor image X Pos"); +extern INT_VAR_H (editor_image_ypos, 10, "Editor image Y Pos"); +extern INT_VAR_H (editor_image_height, 680, "Editor image height"); +extern INT_VAR_H (editor_image_width, 655, "Editor image width"); +extern INT_VAR_H (editor_image_word_bb_color, BLUE, +"Word bounding box colour"); +extern INT_VAR_H (editor_image_blob_bb_color, YELLOW, +"Blob bounding box colour"); +extern INT_VAR_H (editor_image_text_color, WHITE, "Correct text colour"); +extern STRING_VAR_H (editor_dbwin_name, "EditorDBWin", +"Editor debug window name"); +extern INT_VAR_H (editor_dbwin_xpos, 50, "Editor debug window X Pos"); +extern INT_VAR_H (editor_dbwin_ypos, 500, "Editor debug window Y Pos"); +extern INT_VAR_H (editor_dbwin_height, 24, "Editor debug window height"); +extern INT_VAR_H (editor_dbwin_width, 80, "Editor debug window width"); +extern STRING_VAR_H (editor_word_name, "BlnWords", +"BL normalised word window"); +extern INT_VAR_H (editor_word_xpos, 60, "Word window X Pos"); +extern INT_VAR_H (editor_word_ypos, 510, "Word window Y Pos"); +extern INT_VAR_H (editor_word_height, 240, "Word window height"); +extern INT_VAR_H (editor_word_width, 655, "Word window width"); +extern double_VAR_H (editor_smd_scale_factor, 1.0, "Scaling for smd image"); + +ScrollView* bln_word_window_handle(); //return handle +void build_image_window(int width, int height); +void display_bln_lines(ScrollView window, + ScrollView::Color colour, + float scale_factor, + float y_offset, + float minx, + float maxx); + //function to call +void pgeditor_msg( //message display + const char *msg); +void pgeditor_show_point( //display coords + SVEvent *event); + //put bln word in box +void show_point(PAGE_RES* page_res, float x, float y); + +#endif diff --git a/src/ccmain/reject.h b/src/ccmain/reject.h index 82a4caf17a..cffb262cbe 100644 --- a/src/ccmain/reject.h +++ b/src/ccmain/reject.h @@ -1,34 +1,34 @@ -/********************************************************************** - * File: reject.h (Formerly reject.h) - * Description: Rejection functions used in tessedit - * Author: Phil Cheatle - * Created: Wed Sep 23 16:50:21 BST 1992 - * - * (C) Copyright 1992, Hewlett-Packard Ltd. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -#ifndef REJECT_H -#define REJECT_H - -#include "params.h" -#include "pageres.h" - -void reject_blanks(WERD_RES *word); -void reject_poor_matches(WERD_RES *word); -float compute_reject_threshold(WERD_CHOICE* word); -BOOL8 word_contains_non_1_digit(const char *word, const char *word_lengths); -void dont_allow_1Il(WERD_RES *word); -void flip_hyphens(WERD_RES *word); -void flip_0O(WERD_RES *word); -BOOL8 non_0_digit(const char* str, int length); -#endif +/********************************************************************** + * File: reject.h (Formerly reject.h) + * Description: Rejection functions used in tessedit + * Author: Phil Cheatle + * Created: Wed Sep 23 16:50:21 BST 1992 + * + * (C) Copyright 1992, Hewlett-Packard Ltd. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +#ifndef REJECT_H +#define REJECT_H + +#include "params.h" +#include "pageres.h" + +void reject_blanks(WERD_RES *word); +void reject_poor_matches(WERD_RES *word); +float compute_reject_threshold(WERD_CHOICE* word); +BOOL8 word_contains_non_1_digit(const char *word, const char *word_lengths); +void dont_allow_1Il(WERD_RES *word); +void flip_hyphens(WERD_RES *word); +void flip_0O(WERD_RES *word); +BOOL8 non_0_digit(const char* str, int length); +#endif diff --git a/src/ccmain/tessbox.h b/src/ccmain/tessbox.h index a2b6b2546c..d655a20401 100644 --- a/src/ccmain/tessbox.h +++ b/src/ccmain/tessbox.h @@ -1,28 +1,28 @@ -/********************************************************************** - * File: tessbox.h (Formerly tessbox.h) - * Description: Black boxed Tess for developing a resaljet. - * Author: Ray Smith - * Created: Thu Apr 23 11:03:36 BST 1992 - * - * (C) Copyright 1992, Hewlett-Packard Ltd. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -#ifndef TESSBOX_H -#define TESSBOX_H - -#include "ratngs.h" -#include "tesseractclass.h" - -// TODO(ocr-team): Delete this along with other empty header files. - -#endif +/********************************************************************** + * File: tessbox.h (Formerly tessbox.h) + * Description: Black boxed Tess for developing a resaljet. + * Author: Ray Smith + * Created: Thu Apr 23 11:03:36 BST 1992 + * + * (C) Copyright 1992, Hewlett-Packard Ltd. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +#ifndef TESSBOX_H +#define TESSBOX_H + +#include "ratngs.h" +#include "tesseractclass.h" + +// TODO(ocr-team): Delete this along with other empty header files. + +#endif diff --git a/src/ccmain/tessedit.h b/src/ccmain/tessedit.h index c9f38d6bbc..5510e19585 100644 --- a/src/ccmain/tessedit.h +++ b/src/ccmain/tessedit.h @@ -1,29 +1,29 @@ -/********************************************************************** - * File: tessedit.h (Formerly tessedit.h) - * Description: Main program for merge of tess and editor. - * Author: Ray Smith - * Created: Tue Jan 07 15:21:46 GMT 1992 - * - * (C) Copyright 1992, Hewlett-Packard Ltd. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -#ifndef TESSEDIT_H -#define TESSEDIT_H - -#include "blobs.h" -#include "pgedit.h" - - //progress monitor -extern ETEXT_DESC *global_monitor; - -#endif +/********************************************************************** + * File: tessedit.h (Formerly tessedit.h) + * Description: Main program for merge of tess and editor. + * Author: Ray Smith + * Created: Tue Jan 07 15:21:46 GMT 1992 + * + * (C) Copyright 1992, Hewlett-Packard Ltd. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +#ifndef TESSEDIT_H +#define TESSEDIT_H + +#include "blobs.h" +#include "pgedit.h" + + //progress monitor +extern ETEXT_DESC *global_monitor; + +#endif diff --git a/src/ccmain/tessvars.cpp b/src/ccmain/tessvars.cpp index 2fb94fed42..db9a1b5bcf 100644 --- a/src/ccmain/tessvars.cpp +++ b/src/ccmain/tessvars.cpp @@ -1,24 +1,24 @@ -/********************************************************************** - * File: tessvars.cpp (Formerly tessvars.c) - * Description: Variables and other globals for tessedit. - * Author: Ray Smith - * Created: Mon Apr 13 13:13:23 BST 1992 - * - * (C) Copyright 1992, Hewlett-Packard Ltd. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -#include - -#include "tessvars.h" - -FILE *debug_fp = stderr; // write debug stuff here +/********************************************************************** + * File: tessvars.cpp (Formerly tessvars.c) + * Description: Variables and other globals for tessedit. + * Author: Ray Smith + * Created: Mon Apr 13 13:13:23 BST 1992 + * + * (C) Copyright 1992, Hewlett-Packard Ltd. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +#include + +#include "tessvars.h" + +FILE *debug_fp = stderr; // write debug stuff here diff --git a/src/ccmain/tessvars.h b/src/ccmain/tessvars.h index 9b0cf38e66..326efef539 100644 --- a/src/ccmain/tessvars.h +++ b/src/ccmain/tessvars.h @@ -1,27 +1,27 @@ -/********************************************************************** - * File: tessvars.h (Formerly tessvars.h) - * Description: Variables and other globals for tessedit. - * Author: Ray Smith - * Created: Mon Apr 13 13:13:23 BST 1992 - * - * (C) Copyright 1992, Hewlett-Packard Ltd. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -#ifndef TESSVARS_H -#define TESSVARS_H - -#include - - -extern FILE *debug_fp; // write debug stuff here -#endif +/********************************************************************** + * File: tessvars.h (Formerly tessvars.h) + * Description: Variables and other globals for tessedit. + * Author: Ray Smith + * Created: Mon Apr 13 13:13:23 BST 1992 + * + * (C) Copyright 1992, Hewlett-Packard Ltd. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +#ifndef TESSVARS_H +#define TESSVARS_H + +#include + + +extern FILE *debug_fp; // write debug stuff here +#endif diff --git a/src/ccmain/werdit.h b/src/ccmain/werdit.h index 0f37301600..4366dbb08c 100644 --- a/src/ccmain/werdit.h +++ b/src/ccmain/werdit.h @@ -1,27 +1,27 @@ -/********************************************************************** - * File: wordit.h - * Description: An iterator for passing over all the words in a document. - * Author: Ray Smith - * Created: Mon Apr 27 08:51:22 BST 1992 - * - * (C) Copyright 1992, Hewlett-Packard Ltd. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -#ifndef WERDIT_H -#define WERDIT_H - -#include "pageres.h" - -PAGE_RES_IT* make_pseudo_word(PAGE_RES* page_res, const TBOX& selection_box); - -#endif +/********************************************************************** + * File: wordit.h + * Description: An iterator for passing over all the words in a document. + * Author: Ray Smith + * Created: Mon Apr 27 08:51:22 BST 1992 + * + * (C) Copyright 1992, Hewlett-Packard Ltd. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +#ifndef WERDIT_H +#define WERDIT_H + +#include "pageres.h" + +PAGE_RES_IT* make_pseudo_word(PAGE_RES* page_res, const TBOX& selection_box); + +#endif diff --git a/src/ccstruct/blckerr.h b/src/ccstruct/blckerr.h index 9fa9ee6914..e306163983 100644 --- a/src/ccstruct/blckerr.h +++ b/src/ccstruct/blckerr.h @@ -1,29 +1,29 @@ -/********************************************************************** - * File: blckerr.h (Formerly blockerr.h) - * Description: Error codes for the page block classes. - * Author: Ray Smith - * Created: Tue Mar 19 17:43:30 GMT 1991 - * - * (C) Copyright 1991, Hewlett-Packard Ltd. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -#ifndef BLCKERR_H -#define BLCKERR_H - -#include "errcode.h" - -const ERRCODE BADBLOCKLINE = "Y coordinate in block out of bounds"; -const ERRCODE LOSTBLOCKLINE = "Can't find rectangle for line"; -const ERRCODE ILLEGAL_GRADIENT = "Gradient wrong side of edge step!"; -const ERRCODE WRONG_WORD = "Word doesn't have blobs of that type"; -#endif +/********************************************************************** + * File: blckerr.h (Formerly blockerr.h) + * Description: Error codes for the page block classes. + * Author: Ray Smith + * Created: Tue Mar 19 17:43:30 GMT 1991 + * + * (C) Copyright 1991, Hewlett-Packard Ltd. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +#ifndef BLCKERR_H +#define BLCKERR_H + +#include "errcode.h" + +const ERRCODE BADBLOCKLINE = "Y coordinate in block out of bounds"; +const ERRCODE LOSTBLOCKLINE = "Can't find rectangle for line"; +const ERRCODE ILLEGAL_GRADIENT = "Gradient wrong side of edge step!"; +const ERRCODE WRONG_WORD = "Word doesn't have blobs of that type"; +#endif diff --git a/src/ccstruct/boxword.h b/src/ccstruct/boxword.h index 81b35be67e..86022a5e98 100644 --- a/src/ccstruct/boxword.h +++ b/src/ccstruct/boxword.h @@ -1,100 +1,100 @@ -/////////////////////////////////////////////////////////////////////// -// File: boxword.h -// Description: Class to represent the bounding boxes of the output. -// Author: Ray Smith -// Created: Tue May 25 14:18:14 PDT 2010 -// -// (C) Copyright 2010, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -#ifndef TESSERACT_CSTRUCT_BOXWORD_H_ -#define TESSERACT_CSTRUCT_BOXWORD_H_ - -#include "genericvector.h" -#include "rect.h" -#include "unichar.h" - -class BLOCK; -class DENORM; -struct TWERD; -class UNICHARSET; -class WERD; -class WERD_CHOICE; -class WERD_RES; - -namespace tesseract { - -// Class to hold an array of bounding boxes for an output word and -// the bounding box of the whole word. -class BoxWord { - public: - BoxWord(); - explicit BoxWord(const BoxWord& src); - ~BoxWord(); - - BoxWord& operator=(const BoxWord& src); - - void CopyFrom(const BoxWord& src); - - // Factory to build a BoxWord from a TWERD using the DENORMs on each blob to - // switch back to original image coordinates. - static BoxWord* CopyFromNormalized(TWERD* tessword); - - // Clean up the bounding boxes from the polygonal approximation by - // expanding slightly, then clipping to the blobs from the original_word - // that overlap. If not null, the block provides the inverse rotation. - void ClipToOriginalWord(const BLOCK* block, WERD* original_word); - - // Merges the boxes from start to end, not including end, and deletes - // the boxes between start and end. - void MergeBoxes(int start, int end); - - // Inserts a new box before the given index. - // Recomputes the bounding box. - void InsertBox(int index, const TBOX& box); - - // Changes the box at the given index to the new box. - // Recomputes the bounding box. - void ChangeBox(int index, const TBOX& box); - - // Deletes the box with the given index, and shuffles up the rest. - // Recomputes the bounding box. - void DeleteBox(int index); - - // Deletes all the boxes stored in BoxWord. - void DeleteAllBoxes(); - - // This and other putatively are the same, so call the (permanent) callback - // for each blob index where the bounding boxes match. - // The callback is deleted on completion. - void ProcessMatchedBlobs(const TWERD& other, TessCallback1* cb) const; - - const TBOX& bounding_box() const { - return bbox_; - } - int length() const { return length_; } - const TBOX& BlobBox(int index) const { - return boxes_[index]; - } - - private: - void ComputeBoundingBox(); - - TBOX bbox_; - int length_; - GenericVector boxes_; -}; - -} // namespace tesseract. - -#endif // TESSERACT_CSTRUCT_BOXWORD_H_ +/////////////////////////////////////////////////////////////////////// +// File: boxword.h +// Description: Class to represent the bounding boxes of the output. +// Author: Ray Smith +// Created: Tue May 25 14:18:14 PDT 2010 +// +// (C) Copyright 2010, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +#ifndef TESSERACT_CSTRUCT_BOXWORD_H_ +#define TESSERACT_CSTRUCT_BOXWORD_H_ + +#include "genericvector.h" +#include "rect.h" +#include "unichar.h" + +class BLOCK; +class DENORM; +struct TWERD; +class UNICHARSET; +class WERD; +class WERD_CHOICE; +class WERD_RES; + +namespace tesseract { + +// Class to hold an array of bounding boxes for an output word and +// the bounding box of the whole word. +class BoxWord { + public: + BoxWord(); + explicit BoxWord(const BoxWord& src); + ~BoxWord(); + + BoxWord& operator=(const BoxWord& src); + + void CopyFrom(const BoxWord& src); + + // Factory to build a BoxWord from a TWERD using the DENORMs on each blob to + // switch back to original image coordinates. + static BoxWord* CopyFromNormalized(TWERD* tessword); + + // Clean up the bounding boxes from the polygonal approximation by + // expanding slightly, then clipping to the blobs from the original_word + // that overlap. If not null, the block provides the inverse rotation. + void ClipToOriginalWord(const BLOCK* block, WERD* original_word); + + // Merges the boxes from start to end, not including end, and deletes + // the boxes between start and end. + void MergeBoxes(int start, int end); + + // Inserts a new box before the given index. + // Recomputes the bounding box. + void InsertBox(int index, const TBOX& box); + + // Changes the box at the given index to the new box. + // Recomputes the bounding box. + void ChangeBox(int index, const TBOX& box); + + // Deletes the box with the given index, and shuffles up the rest. + // Recomputes the bounding box. + void DeleteBox(int index); + + // Deletes all the boxes stored in BoxWord. + void DeleteAllBoxes(); + + // This and other putatively are the same, so call the (permanent) callback + // for each blob index where the bounding boxes match. + // The callback is deleted on completion. + void ProcessMatchedBlobs(const TWERD& other, TessCallback1* cb) const; + + const TBOX& bounding_box() const { + return bbox_; + } + int length() const { return length_; } + const TBOX& BlobBox(int index) const { + return boxes_[index]; + } + + private: + void ComputeBoundingBox(); + + TBOX bbox_; + int length_; + GenericVector boxes_; +}; + +} // namespace tesseract. + +#endif // TESSERACT_CSTRUCT_BOXWORD_H_ diff --git a/src/ccstruct/ccstruct.cpp b/src/ccstruct/ccstruct.cpp index 703e7bac74..d030f5076d 100644 --- a/src/ccstruct/ccstruct.cpp +++ b/src/ccstruct/ccstruct.cpp @@ -1,36 +1,36 @@ -/////////////////////////////////////////////////////////////////////// -// File: ccstruct.cpp -// Description: ccstruct class. -// Author: Samuel Charron -// -// (C) Copyright 2006, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -#include "ccstruct.h" - -namespace tesseract { - -// APPROXIMATIONS of the fractions of the character cell taken by -// the descenders, ascenders, and x-height. -const double CCStruct::kDescenderFraction = 0.25; -const double CCStruct::kXHeightFraction = 0.5; -const double CCStruct::kAscenderFraction = 0.25; -const double CCStruct::kXHeightCapRatio = CCStruct::kXHeightFraction / - (CCStruct::kXHeightFraction + CCStruct::kAscenderFraction); - -CCStruct::CCStruct() {} - -CCStruct::~CCStruct() { -} - -} +/////////////////////////////////////////////////////////////////////// +// File: ccstruct.cpp +// Description: ccstruct class. +// Author: Samuel Charron +// +// (C) Copyright 2006, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +#include "ccstruct.h" + +namespace tesseract { + +// APPROXIMATIONS of the fractions of the character cell taken by +// the descenders, ascenders, and x-height. +const double CCStruct::kDescenderFraction = 0.25; +const double CCStruct::kXHeightFraction = 0.5; +const double CCStruct::kAscenderFraction = 0.25; +const double CCStruct::kXHeightCapRatio = CCStruct::kXHeightFraction / + (CCStruct::kXHeightFraction + CCStruct::kAscenderFraction); + +CCStruct::CCStruct() {} + +CCStruct::~CCStruct() { +} + +} diff --git a/src/ccstruct/ccstruct.h b/src/ccstruct/ccstruct.h index cdd83d1381..2c8aac1635 100644 --- a/src/ccstruct/ccstruct.h +++ b/src/ccstruct/ccstruct.h @@ -1,43 +1,43 @@ -/////////////////////////////////////////////////////////////////////// -// File: ccstruct.h -// Description: ccstruct class. -// Author: Samuel Charron -// -// (C) Copyright 2006, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -#ifndef TESSERACT_CCSTRUCT_CCSTRUCT_H_ -#define TESSERACT_CCSTRUCT_CCSTRUCT_H_ - -#include "cutil.h" - -namespace tesseract { -class CCStruct : public CUtil { - public: - CCStruct(); - ~CCStruct(); - - // Globally accessible constants. - // APPROXIMATIONS of the fractions of the character cell taken by - // the descenders, ascenders, and x-height. - static const double kDescenderFraction; // = 0.25; - static const double kXHeightFraction; // = 0.5; - static const double kAscenderFraction; // = 0.25; - // Derived value giving the x-height as a fraction of cap-height. - static const double kXHeightCapRatio; // = XHeight/(XHeight + Ascender). -}; - -class Tesseract; -} // namespace tesseract - -#endif // TESSERACT_CCSTRUCT_CCSTRUCT_H_ +/////////////////////////////////////////////////////////////////////// +// File: ccstruct.h +// Description: ccstruct class. +// Author: Samuel Charron +// +// (C) Copyright 2006, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +#ifndef TESSERACT_CCSTRUCT_CCSTRUCT_H_ +#define TESSERACT_CCSTRUCT_CCSTRUCT_H_ + +#include "cutil.h" + +namespace tesseract { +class CCStruct : public CUtil { + public: + CCStruct(); + ~CCStruct(); + + // Globally accessible constants. + // APPROXIMATIONS of the fractions of the character cell taken by + // the descenders, ascenders, and x-height. + static const double kDescenderFraction; // = 0.25; + static const double kXHeightFraction; // = 0.5; + static const double kAscenderFraction; // = 0.25; + // Derived value giving the x-height as a fraction of cap-height. + static const double kXHeightCapRatio; // = XHeight/(XHeight + Ascender). +}; + +class Tesseract; +} // namespace tesseract + +#endif // TESSERACT_CCSTRUCT_CCSTRUCT_H_ diff --git a/src/ccstruct/debugpixa.h b/src/ccstruct/debugpixa.h index b556a81d35..37e6321563 100644 --- a/src/ccstruct/debugpixa.h +++ b/src/ccstruct/debugpixa.h @@ -1,52 +1,52 @@ -#ifndef TESSERACT_CCSTRUCT_DEBUGPIXA_H_ -#define TESSERACT_CCSTRUCT_DEBUGPIXA_H_ - -#include "allheaders.h" - -namespace tesseract { - -// Class to hold a Pixa collection of debug images with captions and save them -// to a PDF file. -class DebugPixa { - public: - // TODO(rays) add another constructor with size control. - DebugPixa() { - pixa_ = pixaCreate(0); - fonts_ = bmfCreate(nullptr, 14); - } - // If the filename_ has been set and there are any debug images, they are - // written to the set filename_. - ~DebugPixa() { - pixaDestroy(&pixa_); - bmfDestroy(&fonts_); - } - - // Adds the given pix to the set of pages in the PDF file, with the given - // caption added to the top. - void AddPix(const Pix* pix, const char* caption) { - int depth = pixGetDepth(const_cast(pix)); - int color = depth < 8 ? 1 : (depth > 8 ? 0x00ff0000 : 0x80); - Pix* pix_debug = pixAddSingleTextblock( - const_cast(pix), fonts_, caption, color, L_ADD_BELOW, nullptr); - pixaAddPix(pixa_, pix_debug, L_INSERT); - } - - // Sets the destination filename and enables images to be written to a PDF - // on destruction. - void WritePDF(const char* filename) { - if (pixaGetCount(pixa_) > 0) { - pixaConvertToPdf(pixa_, 300, 1.0f, 0, 0, "AllDebugImages", filename); - pixaClear(pixa_); - } - } - - private: - // The collection of images to put in the PDF. - Pixa* pixa_; - // The fonts used to draw text captions. - L_Bmf* fonts_; -}; - -} // namespace tesseract - -#endif // TESSERACT_CCSTRUCT_DEBUGPIXA_H_ +#ifndef TESSERACT_CCSTRUCT_DEBUGPIXA_H_ +#define TESSERACT_CCSTRUCT_DEBUGPIXA_H_ + +#include "allheaders.h" + +namespace tesseract { + +// Class to hold a Pixa collection of debug images with captions and save them +// to a PDF file. +class DebugPixa { + public: + // TODO(rays) add another constructor with size control. + DebugPixa() { + pixa_ = pixaCreate(0); + fonts_ = bmfCreate(nullptr, 14); + } + // If the filename_ has been set and there are any debug images, they are + // written to the set filename_. + ~DebugPixa() { + pixaDestroy(&pixa_); + bmfDestroy(&fonts_); + } + + // Adds the given pix to the set of pages in the PDF file, with the given + // caption added to the top. + void AddPix(const Pix* pix, const char* caption) { + int depth = pixGetDepth(const_cast(pix)); + int color = depth < 8 ? 1 : (depth > 8 ? 0x00ff0000 : 0x80); + Pix* pix_debug = pixAddSingleTextblock( + const_cast(pix), fonts_, caption, color, L_ADD_BELOW, nullptr); + pixaAddPix(pixa_, pix_debug, L_INSERT); + } + + // Sets the destination filename and enables images to be written to a PDF + // on destruction. + void WritePDF(const char* filename) { + if (pixaGetCount(pixa_) > 0) { + pixaConvertToPdf(pixa_, 300, 1.0f, 0, 0, "AllDebugImages", filename); + pixaClear(pixa_); + } + } + + private: + // The collection of images to put in the PDF. + Pixa* pixa_; + // The fonts used to draw text captions. + L_Bmf* fonts_; +}; + +} // namespace tesseract + +#endif // TESSERACT_CCSTRUCT_DEBUGPIXA_H_ diff --git a/src/ccstruct/detlinefit.cpp b/src/ccstruct/detlinefit.cpp index 8e9a502c98..2540925f8c 100644 --- a/src/ccstruct/detlinefit.cpp +++ b/src/ccstruct/detlinefit.cpp @@ -1,295 +1,295 @@ -/////////////////////////////////////////////////////////////////////// -// File: detlinefit.cpp -// Description: Deterministic least median squares line fitting. -// Author: Ray Smith -// Created: Thu Feb 28 14:45:01 PDT 2008 -// -// (C) Copyright 2008, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -#include "detlinefit.h" -#include "statistc.h" -#include "ndminx.h" -#include "tprintf.h" - -namespace tesseract { - -// The number of points to consider at each end. -const int kNumEndPoints = 3; -// The minimum number of points at which to switch to number of points -// for badly fitted lines. -// To ensure a sensible error metric, kMinPointsForErrorCount should be at -// least kMaxRealDistance / (1 - %ile) where %ile is the fractile used in -// ComputeUpperQuartileError. -const int kMinPointsForErrorCount = 16; -// The maximum real distance to use before switching to number of -// mis-fitted points, which will get square-rooted for true distance. -const int kMaxRealDistance = 2.0; - -DetLineFit::DetLineFit() : square_length_(0.0) { -} - -DetLineFit::~DetLineFit() { -} - -// Delete all Added points. -void DetLineFit::Clear() { - pts_.clear(); - distances_.clear(); -} - -// Add a new point. Takes a copy - the pt doesn't need to stay in scope. -void DetLineFit::Add(const ICOORD& pt) { - pts_.push_back(PointWidth(pt, 0)); -} -// Associates a half-width with the given point if a point overlaps the -// previous point by more than half the width, and its distance is further -// than the previous point, then the more distant point is ignored in the -// distance calculation. Useful for ignoring i dots and other diacritics. -void DetLineFit::Add(const ICOORD& pt, int halfwidth) { - pts_.push_back(PointWidth(pt, halfwidth)); -} - -// Fits a line to the points, ignoring the skip_first initial points and the -// skip_last final points, returning the fitted line as a pair of points, -// and the upper quartile error. -double DetLineFit::Fit(int skip_first, int skip_last, - ICOORD* pt1, ICOORD* pt2) { - // Do something sensible with no points. - if (pts_.empty()) { - pt1->set_x(0); - pt1->set_y(0); - *pt2 = *pt1; - return 0.0; - } - // Count the points and find the first and last kNumEndPoints. - int pt_count = pts_.size(); - ICOORD* starts[kNumEndPoints]; - if (skip_first >= pt_count) skip_first = pt_count - 1; - int start_count = 0; - int end_i = MIN(skip_first + kNumEndPoints, pt_count); - for (int i = skip_first; i < end_i; ++i) { - starts[start_count++] = &pts_[i].pt; - } - ICOORD* ends[kNumEndPoints]; - if (skip_last >= pt_count) skip_last = pt_count - 1; - int end_count = 0; - end_i = MAX(0, pt_count - kNumEndPoints - skip_last); - for (int i = pt_count - 1 - skip_last; i >= end_i; --i) { - ends[end_count++] = &pts_[i].pt; - } - // 1 or 2 points need special treatment. - if (pt_count <= 2) { - *pt1 = *starts[0]; - if (pt_count > 1) - *pt2 = *ends[0]; - else - *pt2 = *pt1; - return 0.0; - } - // Although with between 2 and 2*kNumEndPoints-1 points, there will be - // overlap in the starts, ends sets, this is OK and taken care of by the - // if (*start != *end) test below, which also tests for equal input points. - double best_uq = -1.0; - // Iterate each pair of points and find the best fitting line. - for (int i = 0; i < start_count; ++i) { - ICOORD* start = starts[i]; - for (int j = 0; j < end_count; ++j) { - ICOORD* end = ends[j]; - if (*start != *end) { - ComputeDistances(*start, *end); - // Compute the upper quartile error from the line. - double dist = EvaluateLineFit(); - if (dist < best_uq || best_uq < 0.0) { - best_uq = dist; - *pt1 = *start; - *pt2 = *end; - } - } - } - } - // Finally compute the square root to return the true distance. - return best_uq > 0.0 ? sqrt(best_uq) : best_uq; -} - -// Constrained fit with a supplied direction vector. Finds the best line_pt, -// that is one of the supplied points having the median cross product with -// direction, ignoring points that have a cross product outside of the range -// [min_dist, max_dist]. Returns the resulting error metric using the same -// reduced set of points. -// *Makes use of floating point arithmetic* -double DetLineFit::ConstrainedFit(const FCOORD& direction, - double min_dist, double max_dist, - bool debug, ICOORD* line_pt) { - ComputeConstrainedDistances(direction, min_dist, max_dist); - // Do something sensible with no points or computed distances. - if (pts_.empty() || distances_.empty()) { - line_pt->set_x(0); - line_pt->set_y(0); - return 0.0; - } - int median_index = distances_.choose_nth_item(distances_.size() / 2); - *line_pt = distances_[median_index].data; - if (debug) { - tprintf("Constrained fit to dir %g, %g = %d, %d :%d distances:\n", - direction.x(), direction.y(), - line_pt->x(), line_pt->y(), distances_.size()); - for (int i = 0; i < distances_.size(); ++i) { - tprintf("%d: %d, %d -> %g\n", i, distances_[i].data.x(), - distances_[i].data.y(), distances_[i].key); - } - tprintf("Result = %d\n", median_index); - } - // Center distances on the fitted point. - double dist_origin = direction * *line_pt; - for (int i = 0; i < distances_.size(); ++i) { - distances_[i].key -= dist_origin; - } - return sqrt(EvaluateLineFit()); -} - -// Returns true if there were enough points at the last call to Fit or -// ConstrainedFit for the fitted points to be used on a badly fitted line. -bool DetLineFit::SufficientPointsForIndependentFit() const { - return distances_.size() >= kMinPointsForErrorCount; -} - -// Backwards compatible fit returning a gradient and constant. -// Deprecated. Prefer Fit(ICOORD*, ICOORD*) where possible, but use this -// function in preference to the LMS class. -double DetLineFit::Fit(float* m, float* c) { - ICOORD start, end; - double error = Fit(&start, &end); - if (end.x() != start.x()) { - *m = static_cast(end.y() - start.y()) / (end.x() - start.x()); - *c = start.y() - *m * start.x(); - } else { - *m = 0.0f; - *c = 0.0f; - } - return error; -} - -// Backwards compatible constrained fit with a supplied gradient. -// Deprecated. Use ConstrainedFit(const FCOORD& direction) where possible -// to avoid potential difficulties with infinite gradients. -double DetLineFit::ConstrainedFit(double m, float* c) { - // Do something sensible with no points. - if (pts_.empty()) { - *c = 0.0f; - return 0.0; - } - double cos = 1.0 / sqrt(1.0 + m * m); - FCOORD direction(cos, m * cos); - ICOORD line_pt; - double error = ConstrainedFit(direction, -MAX_FLOAT32, MAX_FLOAT32, false, - &line_pt); - *c = line_pt.y() - line_pt.x() * m; - return error; -} - -// Computes and returns the squared evaluation metric for a line fit. -double DetLineFit::EvaluateLineFit() { - // Compute the upper quartile error from the line. - double dist = ComputeUpperQuartileError(); - if (distances_.size() >= kMinPointsForErrorCount && - dist > kMaxRealDistance * kMaxRealDistance) { - // Use the number of mis-fitted points as the error metric, as this - // gives a better measure of fit for badly fitted lines where more - // than a quarter are badly fitted. - double threshold = kMaxRealDistance * sqrt(square_length_); - dist = NumberOfMisfittedPoints(threshold); - } - return dist; -} - -// Computes the absolute error distances of the points from the line, -// and returns the squared upper-quartile error distance. -double DetLineFit::ComputeUpperQuartileError() { - int num_errors = distances_.size(); - if (num_errors == 0) return 0.0; - // Get the absolute values of the errors. - for (int i = 0; i < num_errors; ++i) { - if (distances_[i].key < 0) distances_[i].key = -distances_[i].key; - } - // Now get the upper quartile distance. - int index = distances_.choose_nth_item(3 * num_errors / 4); - double dist = distances_[index].key; - // The true distance is the square root of the dist squared / square_length. - // Don't bother with the square root. Just return the square distance. - return square_length_ > 0.0 ? dist * dist / square_length_ : 0.0; -} - -// Returns the number of sample points that have an error more than threshold. -int DetLineFit::NumberOfMisfittedPoints(double threshold) const { - int num_misfits = 0; - int num_dists = distances_.size(); - // Get the absolute values of the errors. - for (int i = 0; i < num_dists; ++i) { - if (distances_[i].key > threshold) - ++num_misfits; - } - return num_misfits; -} - -// Computes all the cross product distances of the points from the line, -// storing the actual (signed) cross products in distances. -// Ignores distances of points that are further away than the previous point, -// and overlaps the previous point by at least half. -void DetLineFit::ComputeDistances(const ICOORD& start, const ICOORD& end) { - distances_.truncate(0); - ICOORD line_vector = end; - line_vector -= start; - square_length_ = line_vector.sqlength(); - int line_length = IntCastRounded(sqrt(square_length_)); - // Compute the distance of each point from the line. - int prev_abs_dist = 0; - int prev_dot = 0; - for (int i = 0; i < pts_.size(); ++i) { - ICOORD pt_vector = pts_[i].pt; - pt_vector -= start; - int dot = line_vector % pt_vector; - // Compute |line_vector||pt_vector|sin(angle between) - int dist = line_vector * pt_vector; - int abs_dist = dist < 0 ? -dist : dist; - if (abs_dist > prev_abs_dist && i > 0) { - // Ignore this point if it overlaps the previous one. - int separation = abs(dot - prev_dot); - if (separation < line_length * pts_[i].halfwidth || - separation < line_length * pts_[i - 1].halfwidth) - continue; - } - distances_.push_back(DistPointPair(dist, pts_[i].pt)); - prev_abs_dist = abs_dist; - prev_dot = dot; - } -} - -// Computes all the cross product distances of the points perpendicular to -// the given direction, ignoring distances outside of the give distance range, -// storing the actual (signed) cross products in distances_. -void DetLineFit::ComputeConstrainedDistances(const FCOORD& direction, - double min_dist, double max_dist) { - distances_.truncate(0); - square_length_ = direction.sqlength(); - // Compute the distance of each point from the line. - for (int i = 0; i < pts_.size(); ++i) { - FCOORD pt_vector = pts_[i].pt; - // Compute |line_vector||pt_vector|sin(angle between) - double dist = direction * pt_vector; - if (min_dist <= dist && dist <= max_dist) - distances_.push_back(DistPointPair(dist, pts_[i].pt)); - } -} - -} // namespace tesseract. +/////////////////////////////////////////////////////////////////////// +// File: detlinefit.cpp +// Description: Deterministic least median squares line fitting. +// Author: Ray Smith +// Created: Thu Feb 28 14:45:01 PDT 2008 +// +// (C) Copyright 2008, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +#include "detlinefit.h" +#include "statistc.h" +#include "ndminx.h" +#include "tprintf.h" + +namespace tesseract { + +// The number of points to consider at each end. +const int kNumEndPoints = 3; +// The minimum number of points at which to switch to number of points +// for badly fitted lines. +// To ensure a sensible error metric, kMinPointsForErrorCount should be at +// least kMaxRealDistance / (1 - %ile) where %ile is the fractile used in +// ComputeUpperQuartileError. +const int kMinPointsForErrorCount = 16; +// The maximum real distance to use before switching to number of +// mis-fitted points, which will get square-rooted for true distance. +const int kMaxRealDistance = 2.0; + +DetLineFit::DetLineFit() : square_length_(0.0) { +} + +DetLineFit::~DetLineFit() { +} + +// Delete all Added points. +void DetLineFit::Clear() { + pts_.clear(); + distances_.clear(); +} + +// Add a new point. Takes a copy - the pt doesn't need to stay in scope. +void DetLineFit::Add(const ICOORD& pt) { + pts_.push_back(PointWidth(pt, 0)); +} +// Associates a half-width with the given point if a point overlaps the +// previous point by more than half the width, and its distance is further +// than the previous point, then the more distant point is ignored in the +// distance calculation. Useful for ignoring i dots and other diacritics. +void DetLineFit::Add(const ICOORD& pt, int halfwidth) { + pts_.push_back(PointWidth(pt, halfwidth)); +} + +// Fits a line to the points, ignoring the skip_first initial points and the +// skip_last final points, returning the fitted line as a pair of points, +// and the upper quartile error. +double DetLineFit::Fit(int skip_first, int skip_last, + ICOORD* pt1, ICOORD* pt2) { + // Do something sensible with no points. + if (pts_.empty()) { + pt1->set_x(0); + pt1->set_y(0); + *pt2 = *pt1; + return 0.0; + } + // Count the points and find the first and last kNumEndPoints. + int pt_count = pts_.size(); + ICOORD* starts[kNumEndPoints]; + if (skip_first >= pt_count) skip_first = pt_count - 1; + int start_count = 0; + int end_i = MIN(skip_first + kNumEndPoints, pt_count); + for (int i = skip_first; i < end_i; ++i) { + starts[start_count++] = &pts_[i].pt; + } + ICOORD* ends[kNumEndPoints]; + if (skip_last >= pt_count) skip_last = pt_count - 1; + int end_count = 0; + end_i = MAX(0, pt_count - kNumEndPoints - skip_last); + for (int i = pt_count - 1 - skip_last; i >= end_i; --i) { + ends[end_count++] = &pts_[i].pt; + } + // 1 or 2 points need special treatment. + if (pt_count <= 2) { + *pt1 = *starts[0]; + if (pt_count > 1) + *pt2 = *ends[0]; + else + *pt2 = *pt1; + return 0.0; + } + // Although with between 2 and 2*kNumEndPoints-1 points, there will be + // overlap in the starts, ends sets, this is OK and taken care of by the + // if (*start != *end) test below, which also tests for equal input points. + double best_uq = -1.0; + // Iterate each pair of points and find the best fitting line. + for (int i = 0; i < start_count; ++i) { + ICOORD* start = starts[i]; + for (int j = 0; j < end_count; ++j) { + ICOORD* end = ends[j]; + if (*start != *end) { + ComputeDistances(*start, *end); + // Compute the upper quartile error from the line. + double dist = EvaluateLineFit(); + if (dist < best_uq || best_uq < 0.0) { + best_uq = dist; + *pt1 = *start; + *pt2 = *end; + } + } + } + } + // Finally compute the square root to return the true distance. + return best_uq > 0.0 ? sqrt(best_uq) : best_uq; +} + +// Constrained fit with a supplied direction vector. Finds the best line_pt, +// that is one of the supplied points having the median cross product with +// direction, ignoring points that have a cross product outside of the range +// [min_dist, max_dist]. Returns the resulting error metric using the same +// reduced set of points. +// *Makes use of floating point arithmetic* +double DetLineFit::ConstrainedFit(const FCOORD& direction, + double min_dist, double max_dist, + bool debug, ICOORD* line_pt) { + ComputeConstrainedDistances(direction, min_dist, max_dist); + // Do something sensible with no points or computed distances. + if (pts_.empty() || distances_.empty()) { + line_pt->set_x(0); + line_pt->set_y(0); + return 0.0; + } + int median_index = distances_.choose_nth_item(distances_.size() / 2); + *line_pt = distances_[median_index].data; + if (debug) { + tprintf("Constrained fit to dir %g, %g = %d, %d :%d distances:\n", + direction.x(), direction.y(), + line_pt->x(), line_pt->y(), distances_.size()); + for (int i = 0; i < distances_.size(); ++i) { + tprintf("%d: %d, %d -> %g\n", i, distances_[i].data.x(), + distances_[i].data.y(), distances_[i].key); + } + tprintf("Result = %d\n", median_index); + } + // Center distances on the fitted point. + double dist_origin = direction * *line_pt; + for (int i = 0; i < distances_.size(); ++i) { + distances_[i].key -= dist_origin; + } + return sqrt(EvaluateLineFit()); +} + +// Returns true if there were enough points at the last call to Fit or +// ConstrainedFit for the fitted points to be used on a badly fitted line. +bool DetLineFit::SufficientPointsForIndependentFit() const { + return distances_.size() >= kMinPointsForErrorCount; +} + +// Backwards compatible fit returning a gradient and constant. +// Deprecated. Prefer Fit(ICOORD*, ICOORD*) where possible, but use this +// function in preference to the LMS class. +double DetLineFit::Fit(float* m, float* c) { + ICOORD start, end; + double error = Fit(&start, &end); + if (end.x() != start.x()) { + *m = static_cast(end.y() - start.y()) / (end.x() - start.x()); + *c = start.y() - *m * start.x(); + } else { + *m = 0.0f; + *c = 0.0f; + } + return error; +} + +// Backwards compatible constrained fit with a supplied gradient. +// Deprecated. Use ConstrainedFit(const FCOORD& direction) where possible +// to avoid potential difficulties with infinite gradients. +double DetLineFit::ConstrainedFit(double m, float* c) { + // Do something sensible with no points. + if (pts_.empty()) { + *c = 0.0f; + return 0.0; + } + double cos = 1.0 / sqrt(1.0 + m * m); + FCOORD direction(cos, m * cos); + ICOORD line_pt; + double error = ConstrainedFit(direction, -MAX_FLOAT32, MAX_FLOAT32, false, + &line_pt); + *c = line_pt.y() - line_pt.x() * m; + return error; +} + +// Computes and returns the squared evaluation metric for a line fit. +double DetLineFit::EvaluateLineFit() { + // Compute the upper quartile error from the line. + double dist = ComputeUpperQuartileError(); + if (distances_.size() >= kMinPointsForErrorCount && + dist > kMaxRealDistance * kMaxRealDistance) { + // Use the number of mis-fitted points as the error metric, as this + // gives a better measure of fit for badly fitted lines where more + // than a quarter are badly fitted. + double threshold = kMaxRealDistance * sqrt(square_length_); + dist = NumberOfMisfittedPoints(threshold); + } + return dist; +} + +// Computes the absolute error distances of the points from the line, +// and returns the squared upper-quartile error distance. +double DetLineFit::ComputeUpperQuartileError() { + int num_errors = distances_.size(); + if (num_errors == 0) return 0.0; + // Get the absolute values of the errors. + for (int i = 0; i < num_errors; ++i) { + if (distances_[i].key < 0) distances_[i].key = -distances_[i].key; + } + // Now get the upper quartile distance. + int index = distances_.choose_nth_item(3 * num_errors / 4); + double dist = distances_[index].key; + // The true distance is the square root of the dist squared / square_length. + // Don't bother with the square root. Just return the square distance. + return square_length_ > 0.0 ? dist * dist / square_length_ : 0.0; +} + +// Returns the number of sample points that have an error more than threshold. +int DetLineFit::NumberOfMisfittedPoints(double threshold) const { + int num_misfits = 0; + int num_dists = distances_.size(); + // Get the absolute values of the errors. + for (int i = 0; i < num_dists; ++i) { + if (distances_[i].key > threshold) + ++num_misfits; + } + return num_misfits; +} + +// Computes all the cross product distances of the points from the line, +// storing the actual (signed) cross products in distances. +// Ignores distances of points that are further away than the previous point, +// and overlaps the previous point by at least half. +void DetLineFit::ComputeDistances(const ICOORD& start, const ICOORD& end) { + distances_.truncate(0); + ICOORD line_vector = end; + line_vector -= start; + square_length_ = line_vector.sqlength(); + int line_length = IntCastRounded(sqrt(square_length_)); + // Compute the distance of each point from the line. + int prev_abs_dist = 0; + int prev_dot = 0; + for (int i = 0; i < pts_.size(); ++i) { + ICOORD pt_vector = pts_[i].pt; + pt_vector -= start; + int dot = line_vector % pt_vector; + // Compute |line_vector||pt_vector|sin(angle between) + int dist = line_vector * pt_vector; + int abs_dist = dist < 0 ? -dist : dist; + if (abs_dist > prev_abs_dist && i > 0) { + // Ignore this point if it overlaps the previous one. + int separation = abs(dot - prev_dot); + if (separation < line_length * pts_[i].halfwidth || + separation < line_length * pts_[i - 1].halfwidth) + continue; + } + distances_.push_back(DistPointPair(dist, pts_[i].pt)); + prev_abs_dist = abs_dist; + prev_dot = dot; + } +} + +// Computes all the cross product distances of the points perpendicular to +// the given direction, ignoring distances outside of the give distance range, +// storing the actual (signed) cross products in distances_. +void DetLineFit::ComputeConstrainedDistances(const FCOORD& direction, + double min_dist, double max_dist) { + distances_.truncate(0); + square_length_ = direction.sqlength(); + // Compute the distance of each point from the line. + for (int i = 0; i < pts_.size(); ++i) { + FCOORD pt_vector = pts_[i].pt; + // Compute |line_vector||pt_vector|sin(angle between) + double dist = direction * pt_vector; + if (min_dist <= dist && dist <= max_dist) + distances_.push_back(DistPointPair(dist, pts_[i].pt)); + } +} + +} // namespace tesseract. diff --git a/src/ccstruct/detlinefit.h b/src/ccstruct/detlinefit.h index e49b0207fa..12afbb79bf 100644 --- a/src/ccstruct/detlinefit.h +++ b/src/ccstruct/detlinefit.h @@ -1,164 +1,164 @@ -/////////////////////////////////////////////////////////////////////// -// File: detlinefit.h -// Description: Deterministic least upper-quartile squares line fitting. -// Author: Ray Smith -// Created: Thu Feb 28 14:35:01 PDT 2008 -// -// (C) Copyright 2008, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -#ifndef TESSERACT_CCSTRUCT_DETLINEFIT_H_ -#define TESSERACT_CCSTRUCT_DETLINEFIT_H_ - -#include "genericvector.h" -#include "kdpair.h" -#include "points.h" - -namespace tesseract { - -// This class fits a line to a set of ICOORD points. -// There is no restriction on the direction of the line, as it -// uses a vector method, ie no concern over infinite gradients. -// The fitted line has the least upper quartile of squares of perpendicular -// distances of all source points from the line, subject to the constraint -// that the line is made from one of the pairs of [{p1,p2,p3},{pn-2, pn-1, pn}] -// i.e. the 9 combinations of one of the first 3 and last 3 points. -// A fundamental assumption of this algorithm is that one of the first 3 and -// one of the last 3 points are near the best line fit. -// The points must be Added in line order for the algorithm to work properly. -// No floating point calculations are needed* to make an accurate fit, -// and no random numbers are needed** so the algorithm is deterministic, -// architecture-stable, and compiler-stable as well as stable to minor -// changes in the input. -// *A single floating point division is used to compute each line's distance. -// This is unlikely to result in choice of a different line, but if it does, -// it would be easy to replace with a 64 bit integer calculation. -// **Random numbers are used in the nth_item function, but the worst -// non-determinism that can result is picking a different result among equals, -// and that wouldn't make any difference to the end-result distance, so the -// randomness does not affect the determinism of the algorithm. The random -// numbers are only there to guarantee average linear time. -// Fitting time is linear, but with a high constant, as it tries 9 different -// lines and computes the distance of all points each time. -// This class is aimed at replacing the LLSQ (linear least squares) and -// LMS (least median of squares) classes that are currently used for most -// of the line fitting in Tesseract. -class DetLineFit { - public: - DetLineFit(); - ~DetLineFit(); - - // Delete all Added points. - void Clear(); - - // Adds a new point. Takes a copy - the pt doesn't need to stay in scope. - // Add must be called on points in sequence along the line. - void Add(const ICOORD& pt); - // Associates a half-width with the given point if a point overlaps the - // previous point by more than half the width, and its distance is further - // than the previous point, then the more distant point is ignored in the - // distance calculation. Useful for ignoring i dots and other diacritics. - void Add(const ICOORD& pt, int halfwidth); - - // Fits a line to the points, returning the fitted line as a pair of - // points, and the upper quartile error. - double Fit(ICOORD* pt1, ICOORD* pt2) { - return Fit(0, 0, pt1, pt2); - } - // Fits a line to the points, ignoring the skip_first initial points and the - // skip_last final points, returning the fitted line as a pair of points, - // and the upper quartile error. - double Fit(int skip_first, int skip_last, ICOORD* pt1, ICOORD* pt2); - - // Constrained fit with a supplied direction vector. Finds the best line_pt, - // that is one of the supplied points having the median cross product with - // direction, ignoring points that have a cross product outside of the range - // [min_dist, max_dist]. Returns the resulting error metric using the same - // reduced set of points. - // *Makes use of floating point arithmetic* - double ConstrainedFit(const FCOORD& direction, - double min_dist, double max_dist, - bool debug, ICOORD* line_pt); - - // Returns true if there were enough points at the last call to Fit or - // ConstrainedFit for the fitted points to be used on a badly fitted line. - bool SufficientPointsForIndependentFit() const; - - // Backwards compatible fit returning a gradient and constant. - // Deprecated. Prefer Fit(ICOORD*, ICOORD*) where possible, but use this - // function in preference to the LMS class. - double Fit(float* m, float* c); - - // Backwards compatible constrained fit with a supplied gradient. - // Deprecated. Use ConstrainedFit(const FCOORD& direction) where possible - // to avoid potential difficulties with infinite gradients. - double ConstrainedFit(double m, float* c); - - private: - // Simple struct to hold an ICOORD point and a halfwidth representing half - // the "width" (supposedly approximately parallel to the direction of the - // line) of each point, such that distant points can be discarded when they - // overlap nearer points. (Think i dot and other diacritics or noise.) - struct PointWidth { - PointWidth() : pt(ICOORD(0, 0)), halfwidth(0) {} - PointWidth(const ICOORD& pt0, int halfwidth0) - : pt(pt0), halfwidth(halfwidth0) {} - - ICOORD pt; - int halfwidth; - }; - // Type holds the distance of each point from the fitted line and the point - // itself. Use of double allows integer distances from ICOORDs to be stored - // exactly, and also the floating point results from ConstrainedFit. - typedef KDPairInc DistPointPair; - - // Computes and returns the squared evaluation metric for a line fit. - double EvaluateLineFit(); - - // Computes the absolute values of the precomputed distances_, - // and returns the squared upper-quartile error distance. - double ComputeUpperQuartileError(); - - // Returns the number of sample points that have an error more than threshold. - int NumberOfMisfittedPoints(double threshold) const; - - // Computes all the cross product distances of the points from the line, - // storing the actual (signed) cross products in distances_. - // Ignores distances of points that are further away than the previous point, - // and overlaps the previous point by at least half. - void ComputeDistances(const ICOORD& start, const ICOORD& end); - - // Computes all the cross product distances of the points perpendicular to - // the given direction, ignoring distances outside of the give distance range, - // storing the actual (signed) cross products in distances_. - void ComputeConstrainedDistances(const FCOORD& direction, - double min_dist, double max_dist); - - // Stores all the source points in the order they were given and their - // halfwidths, if any. - GenericVector pts_; - // Stores the computed perpendicular distances of (some of) the pts_ from a - // given vector (assuming it goes through the origin, making it a line). - // Since the distances may be a subset of the input points, and get - // re-ordered by the nth_item function, the original point is stored - // along side the distance. - GenericVector distances_; // Distances of points. - // The squared length of the vector used to compute distances_. - double square_length_; -}; - -} // namespace tesseract. - -#endif // TESSERACT_CCSTRUCT_DETLINEFIT_H_ - - +/////////////////////////////////////////////////////////////////////// +// File: detlinefit.h +// Description: Deterministic least upper-quartile squares line fitting. +// Author: Ray Smith +// Created: Thu Feb 28 14:35:01 PDT 2008 +// +// (C) Copyright 2008, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +#ifndef TESSERACT_CCSTRUCT_DETLINEFIT_H_ +#define TESSERACT_CCSTRUCT_DETLINEFIT_H_ + +#include "genericvector.h" +#include "kdpair.h" +#include "points.h" + +namespace tesseract { + +// This class fits a line to a set of ICOORD points. +// There is no restriction on the direction of the line, as it +// uses a vector method, ie no concern over infinite gradients. +// The fitted line has the least upper quartile of squares of perpendicular +// distances of all source points from the line, subject to the constraint +// that the line is made from one of the pairs of [{p1,p2,p3},{pn-2, pn-1, pn}] +// i.e. the 9 combinations of one of the first 3 and last 3 points. +// A fundamental assumption of this algorithm is that one of the first 3 and +// one of the last 3 points are near the best line fit. +// The points must be Added in line order for the algorithm to work properly. +// No floating point calculations are needed* to make an accurate fit, +// and no random numbers are needed** so the algorithm is deterministic, +// architecture-stable, and compiler-stable as well as stable to minor +// changes in the input. +// *A single floating point division is used to compute each line's distance. +// This is unlikely to result in choice of a different line, but if it does, +// it would be easy to replace with a 64 bit integer calculation. +// **Random numbers are used in the nth_item function, but the worst +// non-determinism that can result is picking a different result among equals, +// and that wouldn't make any difference to the end-result distance, so the +// randomness does not affect the determinism of the algorithm. The random +// numbers are only there to guarantee average linear time. +// Fitting time is linear, but with a high constant, as it tries 9 different +// lines and computes the distance of all points each time. +// This class is aimed at replacing the LLSQ (linear least squares) and +// LMS (least median of squares) classes that are currently used for most +// of the line fitting in Tesseract. +class DetLineFit { + public: + DetLineFit(); + ~DetLineFit(); + + // Delete all Added points. + void Clear(); + + // Adds a new point. Takes a copy - the pt doesn't need to stay in scope. + // Add must be called on points in sequence along the line. + void Add(const ICOORD& pt); + // Associates a half-width with the given point if a point overlaps the + // previous point by more than half the width, and its distance is further + // than the previous point, then the more distant point is ignored in the + // distance calculation. Useful for ignoring i dots and other diacritics. + void Add(const ICOORD& pt, int halfwidth); + + // Fits a line to the points, returning the fitted line as a pair of + // points, and the upper quartile error. + double Fit(ICOORD* pt1, ICOORD* pt2) { + return Fit(0, 0, pt1, pt2); + } + // Fits a line to the points, ignoring the skip_first initial points and the + // skip_last final points, returning the fitted line as a pair of points, + // and the upper quartile error. + double Fit(int skip_first, int skip_last, ICOORD* pt1, ICOORD* pt2); + + // Constrained fit with a supplied direction vector. Finds the best line_pt, + // that is one of the supplied points having the median cross product with + // direction, ignoring points that have a cross product outside of the range + // [min_dist, max_dist]. Returns the resulting error metric using the same + // reduced set of points. + // *Makes use of floating point arithmetic* + double ConstrainedFit(const FCOORD& direction, + double min_dist, double max_dist, + bool debug, ICOORD* line_pt); + + // Returns true if there were enough points at the last call to Fit or + // ConstrainedFit for the fitted points to be used on a badly fitted line. + bool SufficientPointsForIndependentFit() const; + + // Backwards compatible fit returning a gradient and constant. + // Deprecated. Prefer Fit(ICOORD*, ICOORD*) where possible, but use this + // function in preference to the LMS class. + double Fit(float* m, float* c); + + // Backwards compatible constrained fit with a supplied gradient. + // Deprecated. Use ConstrainedFit(const FCOORD& direction) where possible + // to avoid potential difficulties with infinite gradients. + double ConstrainedFit(double m, float* c); + + private: + // Simple struct to hold an ICOORD point and a halfwidth representing half + // the "width" (supposedly approximately parallel to the direction of the + // line) of each point, such that distant points can be discarded when they + // overlap nearer points. (Think i dot and other diacritics or noise.) + struct PointWidth { + PointWidth() : pt(ICOORD(0, 0)), halfwidth(0) {} + PointWidth(const ICOORD& pt0, int halfwidth0) + : pt(pt0), halfwidth(halfwidth0) {} + + ICOORD pt; + int halfwidth; + }; + // Type holds the distance of each point from the fitted line and the point + // itself. Use of double allows integer distances from ICOORDs to be stored + // exactly, and also the floating point results from ConstrainedFit. + typedef KDPairInc DistPointPair; + + // Computes and returns the squared evaluation metric for a line fit. + double EvaluateLineFit(); + + // Computes the absolute values of the precomputed distances_, + // and returns the squared upper-quartile error distance. + double ComputeUpperQuartileError(); + + // Returns the number of sample points that have an error more than threshold. + int NumberOfMisfittedPoints(double threshold) const; + + // Computes all the cross product distances of the points from the line, + // storing the actual (signed) cross products in distances_. + // Ignores distances of points that are further away than the previous point, + // and overlaps the previous point by at least half. + void ComputeDistances(const ICOORD& start, const ICOORD& end); + + // Computes all the cross product distances of the points perpendicular to + // the given direction, ignoring distances outside of the give distance range, + // storing the actual (signed) cross products in distances_. + void ComputeConstrainedDistances(const FCOORD& direction, + double min_dist, double max_dist); + + // Stores all the source points in the order they were given and their + // halfwidths, if any. + GenericVector pts_; + // Stores the computed perpendicular distances of (some of) the pts_ from a + // given vector (assuming it goes through the origin, making it a line). + // Since the distances may be a subset of the input points, and get + // re-ordered by the nth_item function, the original point is stored + // along side the distance. + GenericVector distances_; // Distances of points. + // The squared length of the vector used to compute distances_. + double square_length_; +}; + +} // namespace tesseract. + +#endif // TESSERACT_CCSTRUCT_DETLINEFIT_H_ + + diff --git a/src/ccstruct/genblob.cpp b/src/ccstruct/genblob.cpp index a989c26099..03ae60b9a4 100644 --- a/src/ccstruct/genblob.cpp +++ b/src/ccstruct/genblob.cpp @@ -1,38 +1,38 @@ -/********************************************************************** - * File: genblob.cpp (Formerly gblob.c) - * Description: Generic Blob processing routines - * Author: Phil Cheatle - * Created: Mon Nov 25 10:53:26 GMT 1991 - * - * (C) Copyright 1991, Hewlett-Packard Ltd. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -#include "genblob.h" -#include "stepblob.h" - -/********************************************************************** - * c_blob_comparator() - * - * Blob comparator used to sort a blob list so that blobs are in increasing - * order of left edge. - **********************************************************************/ - -int c_blob_comparator( // sort blobs - const void *blob1p, // ptr to ptr to blob1 - const void *blob2p // ptr to ptr to blob2 - ) { - C_BLOB *blob1 = *(C_BLOB **) blob1p; - C_BLOB *blob2 = *(C_BLOB **) blob2p; - - return blob1->bounding_box ().left () - blob2->bounding_box ().left (); -} +/********************************************************************** + * File: genblob.cpp (Formerly gblob.c) + * Description: Generic Blob processing routines + * Author: Phil Cheatle + * Created: Mon Nov 25 10:53:26 GMT 1991 + * + * (C) Copyright 1991, Hewlett-Packard Ltd. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +#include "genblob.h" +#include "stepblob.h" + +/********************************************************************** + * c_blob_comparator() + * + * Blob comparator used to sort a blob list so that blobs are in increasing + * order of left edge. + **********************************************************************/ + +int c_blob_comparator( // sort blobs + const void *blob1p, // ptr to ptr to blob1 + const void *blob2p // ptr to ptr to blob2 + ) { + C_BLOB *blob1 = *(C_BLOB **) blob1p; + C_BLOB *blob2 = *(C_BLOB **) blob2p; + + return blob1->bounding_box ().left () - blob2->bounding_box ().left (); +} diff --git a/src/ccstruct/genblob.h b/src/ccstruct/genblob.h index b915b72bcc..2fb55a1a41 100644 --- a/src/ccstruct/genblob.h +++ b/src/ccstruct/genblob.h @@ -1,27 +1,27 @@ -/********************************************************************** - * File: genblob.h (Formerly gblob.h) - * Description: Generic Blob processing routines - * Author: Phil Cheatle - * Created: Mon Nov 25 10:53:26 GMT 1991 - * - * (C) Copyright 1991, Hewlett-Packard Ltd. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -#ifndef GENBLOB_H -#define GENBLOB_H - -// Sort function to sort blobs by ascending left edge. -int c_blob_comparator(const void *blob1p, // ptr to ptr to blob1 - const void *blob2p); - -#endif +/********************************************************************** + * File: genblob.h (Formerly gblob.h) + * Description: Generic Blob processing routines + * Author: Phil Cheatle + * Created: Mon Nov 25 10:53:26 GMT 1991 + * + * (C) Copyright 1991, Hewlett-Packard Ltd. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +#ifndef GENBLOB_H +#define GENBLOB_H + +// Sort function to sort blobs by ascending left edge. +int c_blob_comparator(const void *blob1p, // ptr to ptr to blob1 + const void *blob2p); + +#endif diff --git a/src/ccstruct/hpdsizes.h b/src/ccstruct/hpdsizes.h index e6a960b55d..f4d886a0b4 100644 --- a/src/ccstruct/hpdsizes.h +++ b/src/ccstruct/hpdsizes.h @@ -1,17 +1,17 @@ -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#ifndef HPDSIZES_H -#define HPDSIZES_H - -#define NUM_TEXT_ATTR 10 -#define NUM_BLOCK_ATTR 7 -#define MAXLENGTH 128 -#define NUM_BACKGROUNDS 8 -#endif +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#ifndef HPDSIZES_H +#define HPDSIZES_H + +#define NUM_TEXT_ATTR 10 +#define NUM_BLOCK_ATTR 7 +#define MAXLENGTH 128 +#define NUM_BACKGROUNDS 8 +#endif diff --git a/src/ccstruct/ocrpara.cpp b/src/ccstruct/ocrpara.cpp index 6d285e8c61..f4688472e6 100644 --- a/src/ccstruct/ocrpara.cpp +++ b/src/ccstruct/ocrpara.cpp @@ -1,100 +1,100 @@ -///////////////////////////////////////////////////////////////////// -// File: ocrpara.cpp -// Description: OCR Paragraph Output Type -// Author: David Eger -// Created: 2010-11-15 -// -// (C) Copyright 2010, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -#include - -#include "ocrpara.h" -#include "host.h" // For NearlyEqual() - -ELISTIZE(PARA) - -using tesseract::JUSTIFICATION_LEFT; -using tesseract::JUSTIFICATION_RIGHT; -using tesseract::JUSTIFICATION_CENTER; -using tesseract::JUSTIFICATION_UNKNOWN; - -static STRING ParagraphJustificationToString( - tesseract::ParagraphJustification justification) { - switch (justification) { - case JUSTIFICATION_LEFT: - return "LEFT"; - case JUSTIFICATION_RIGHT: - return "RIGHT"; - case JUSTIFICATION_CENTER: - return "CENTER"; - default: - return "UNKNOWN"; - } -} - -bool ParagraphModel::ValidFirstLine(int lmargin, int lindent, - int rindent, int rmargin) const { - switch (justification_) { - case JUSTIFICATION_LEFT: - return NearlyEqual(lmargin + lindent, margin_ + first_indent_, - tolerance_); - case JUSTIFICATION_RIGHT: - return NearlyEqual(rmargin + rindent, margin_ + first_indent_, - tolerance_); - case JUSTIFICATION_CENTER: - return NearlyEqual(lindent, rindent, tolerance_ * 2); - default: - // shouldn't happen - return false; - } -} - -bool ParagraphModel::ValidBodyLine(int lmargin, int lindent, - int rindent, int rmargin) const { - switch (justification_) { - case JUSTIFICATION_LEFT: - return NearlyEqual(lmargin + lindent, margin_ + body_indent_, - tolerance_); - case JUSTIFICATION_RIGHT: - return NearlyEqual(rmargin + rindent, margin_ + body_indent_, - tolerance_); - case JUSTIFICATION_CENTER: - return NearlyEqual(lindent, rindent, tolerance_ * 2); - default: - // shouldn't happen - return false; - } -} - -bool ParagraphModel::Comparable(const ParagraphModel &other) const { - if (justification_ != other.justification_) - return false; - if (justification_ == JUSTIFICATION_CENTER || - justification_ == JUSTIFICATION_UNKNOWN) - return true; - int tolerance = (tolerance_ + other.tolerance_) / 4; - return NearlyEqual(margin_ + first_indent_, - other.margin_ + other.first_indent_, tolerance) && - NearlyEqual(margin_ + body_indent_, - other.margin_ + other.body_indent_, tolerance); -} - -STRING ParagraphModel::ToString() const { - char buffer[200]; - const STRING &alignment = ParagraphJustificationToString(justification_); - snprintf(buffer, sizeof(buffer), - "margin: %d, first_indent: %d, body_indent: %d, alignment: %s", - margin_, first_indent_, body_indent_, alignment.string()); - return STRING(buffer); -} +///////////////////////////////////////////////////////////////////// +// File: ocrpara.cpp +// Description: OCR Paragraph Output Type +// Author: David Eger +// Created: 2010-11-15 +// +// (C) Copyright 2010, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +#include + +#include "ocrpara.h" +#include "host.h" // For NearlyEqual() + +ELISTIZE(PARA) + +using tesseract::JUSTIFICATION_LEFT; +using tesseract::JUSTIFICATION_RIGHT; +using tesseract::JUSTIFICATION_CENTER; +using tesseract::JUSTIFICATION_UNKNOWN; + +static STRING ParagraphJustificationToString( + tesseract::ParagraphJustification justification) { + switch (justification) { + case JUSTIFICATION_LEFT: + return "LEFT"; + case JUSTIFICATION_RIGHT: + return "RIGHT"; + case JUSTIFICATION_CENTER: + return "CENTER"; + default: + return "UNKNOWN"; + } +} + +bool ParagraphModel::ValidFirstLine(int lmargin, int lindent, + int rindent, int rmargin) const { + switch (justification_) { + case JUSTIFICATION_LEFT: + return NearlyEqual(lmargin + lindent, margin_ + first_indent_, + tolerance_); + case JUSTIFICATION_RIGHT: + return NearlyEqual(rmargin + rindent, margin_ + first_indent_, + tolerance_); + case JUSTIFICATION_CENTER: + return NearlyEqual(lindent, rindent, tolerance_ * 2); + default: + // shouldn't happen + return false; + } +} + +bool ParagraphModel::ValidBodyLine(int lmargin, int lindent, + int rindent, int rmargin) const { + switch (justification_) { + case JUSTIFICATION_LEFT: + return NearlyEqual(lmargin + lindent, margin_ + body_indent_, + tolerance_); + case JUSTIFICATION_RIGHT: + return NearlyEqual(rmargin + rindent, margin_ + body_indent_, + tolerance_); + case JUSTIFICATION_CENTER: + return NearlyEqual(lindent, rindent, tolerance_ * 2); + default: + // shouldn't happen + return false; + } +} + +bool ParagraphModel::Comparable(const ParagraphModel &other) const { + if (justification_ != other.justification_) + return false; + if (justification_ == JUSTIFICATION_CENTER || + justification_ == JUSTIFICATION_UNKNOWN) + return true; + int tolerance = (tolerance_ + other.tolerance_) / 4; + return NearlyEqual(margin_ + first_indent_, + other.margin_ + other.first_indent_, tolerance) && + NearlyEqual(margin_ + body_indent_, + other.margin_ + other.body_indent_, tolerance); +} + +STRING ParagraphModel::ToString() const { + char buffer[200]; + const STRING &alignment = ParagraphJustificationToString(justification_); + snprintf(buffer, sizeof(buffer), + "margin: %d, first_indent: %d, body_indent: %d, alignment: %s", + margin_, first_indent_, body_indent_, alignment.string()); + return STRING(buffer); +} diff --git a/src/ccstruct/otsuthr.h b/src/ccstruct/otsuthr.h index d277cd3cfb..dd35d23f31 100644 --- a/src/ccstruct/otsuthr.h +++ b/src/ccstruct/otsuthr.h @@ -1,56 +1,56 @@ -/////////////////////////////////////////////////////////////////////// -// File: otsuthr.h -// Description: Simple Otsu thresholding for binarizing images. -// Author: Ray Smith -// Created: Fri Mar 07 12:14:01 PST 2008 -// -// (C) Copyright 2008, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -#ifndef TESSERACT_CCMAIN_OTSUTHR_H_ -#define TESSERACT_CCMAIN_OTSUTHR_H_ - -struct Pix; - -namespace tesseract { - -const int kHistogramSize = 256; // The size of a histogram of pixel values. - -// Computes the Otsu threshold(s) for the given image rectangle, making one -// for each channel. Each channel is always one byte per pixel. -// Returns an array of threshold values and an array of hi_values, such -// that a pixel value >threshold[channel] is considered foreground if -// hi_values[channel] is 0 or background if 1. A hi_value of -1 indicates -// that there is no apparent foreground. At least one hi_value will not be -1. -// Delete thresholds and hi_values with delete [] after use. -// The return value is the number of channels in the input image, being -// the size of the output thresholds and hi_values arrays. -int OtsuThreshold(Pix* src_pix, int left, int top, int width, int height, - int** thresholds, int** hi_values); - -// Computes the histogram for the given image rectangle, and the given -// single channel. Each channel is always one byte per pixel. -// Histogram is always a kHistogramSize(256) element array to count -// occurrences of each pixel value. -void HistogramRect(Pix* src_pix, int channel, - int left, int top, int width, int height, - int* histogram); - -// Computes the Otsu threshold(s) for the given histogram. -// Also returns H = total count in histogram, and -// omega0 = count of histogram below threshold. -int OtsuStats(const int* histogram, int* H_out, int* omega0_out); - -} // namespace tesseract. - -#endif // TESSERACT_CCMAIN_OTSUTHR_H_ +/////////////////////////////////////////////////////////////////////// +// File: otsuthr.h +// Description: Simple Otsu thresholding for binarizing images. +// Author: Ray Smith +// Created: Fri Mar 07 12:14:01 PST 2008 +// +// (C) Copyright 2008, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +#ifndef TESSERACT_CCMAIN_OTSUTHR_H_ +#define TESSERACT_CCMAIN_OTSUTHR_H_ + +struct Pix; + +namespace tesseract { + +const int kHistogramSize = 256; // The size of a histogram of pixel values. + +// Computes the Otsu threshold(s) for the given image rectangle, making one +// for each channel. Each channel is always one byte per pixel. +// Returns an array of threshold values and an array of hi_values, such +// that a pixel value >threshold[channel] is considered foreground if +// hi_values[channel] is 0 or background if 1. A hi_value of -1 indicates +// that there is no apparent foreground. At least one hi_value will not be -1. +// Delete thresholds and hi_values with delete [] after use. +// The return value is the number of channels in the input image, being +// the size of the output thresholds and hi_values arrays. +int OtsuThreshold(Pix* src_pix, int left, int top, int width, int height, + int** thresholds, int** hi_values); + +// Computes the histogram for the given image rectangle, and the given +// single channel. Each channel is always one byte per pixel. +// Histogram is always a kHistogramSize(256) element array to count +// occurrences of each pixel value. +void HistogramRect(Pix* src_pix, int channel, + int left, int top, int width, int height, + int* histogram); + +// Computes the Otsu threshold(s) for the given histogram. +// Also returns H = total count in histogram, and +// omega0 = count of histogram below threshold. +int OtsuStats(const int* histogram, int* H_out, int* omega0_out); + +} // namespace tesseract. + +#endif // TESSERACT_CCMAIN_OTSUTHR_H_ diff --git a/src/ccstruct/params_training_featdef.h b/src/ccstruct/params_training_featdef.h index 961baab182..6e021f0b30 100644 --- a/src/ccstruct/params_training_featdef.h +++ b/src/ccstruct/params_training_featdef.h @@ -1,149 +1,149 @@ -/////////////////////////////////////////////////////////////////////// -// File: params_training_featdef.h -// Description: Feature definitions for params training. -// Author: Rika Antonova -// Created: Mon Nov 28 11:26:42 PDT 2011 -// -// (C) Copyright 2011, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -#ifndef TESSERACT_WORDREC_PARAMS_TRAINING_FEATDEF_H_ -#define TESSERACT_WORDREC_PARAMS_TRAINING_FEATDEF_H_ - -#include "genericvector.h" -#include "strngs.h" - -namespace tesseract { - -// Maximum number of unichars in the small and medium sized words -static const int kMaxSmallWordUnichars = 3; -static const int kMaxMediumWordUnichars = 6; - -// Raw features extracted from a single OCR hypothesis. -// The features are normalized (by outline length or number of unichars as -// appropriate) real-valued quantities with unbounded range and -// unknown distribution. -// Normalization / binarization of these features is done at a later stage. -// Note: when adding new fields to this enum make sure to modify -// kParamsTrainingFeatureTypeName -enum kParamsTrainingFeatureType { - // Digits - PTRAIN_DIGITS_SHORT, // 0 - PTRAIN_DIGITS_MED, // 1 - PTRAIN_DIGITS_LONG, // 2 - // Number or pattern (NUMBER_PERM, USER_PATTERN_PERM) - PTRAIN_NUM_SHORT, // 3 - PTRAIN_NUM_MED, // 4 - PTRAIN_NUM_LONG, // 5 - // Document word (DOC_DAWG_PERM) - PTRAIN_DOC_SHORT, // 6 - PTRAIN_DOC_MED, // 7 - PTRAIN_DOC_LONG, // 8 - // Word (SYSTEM_DAWG_PERM, USER_DAWG_PERM, COMPOUND_PERM) - PTRAIN_DICT_SHORT, // 9 - PTRAIN_DICT_MED, // 10 - PTRAIN_DICT_LONG, // 11 - // Frequent word (FREQ_DAWG_PERM) - PTRAIN_FREQ_SHORT, // 12 - PTRAIN_FREQ_MED, // 13 - PTRAIN_FREQ_LONG, // 14 - PTRAIN_SHAPE_COST_PER_CHAR, // 15 - PTRAIN_NGRAM_COST_PER_CHAR, // 16 - PTRAIN_NUM_BAD_PUNC, // 17 - PTRAIN_NUM_BAD_CASE, // 18 - PTRAIN_XHEIGHT_CONSISTENCY, // 19 - PTRAIN_NUM_BAD_CHAR_TYPE, // 20 - PTRAIN_NUM_BAD_SPACING, // 21 - PTRAIN_NUM_BAD_FONT, // 22 - PTRAIN_RATING_PER_CHAR, // 23 - - PTRAIN_NUM_FEATURE_TYPES -}; - -static const char * const kParamsTrainingFeatureTypeName[] = { - "PTRAIN_DIGITS_SHORT", // 0 - "PTRAIN_DIGITS_MED", // 1 - "PTRAIN_DIGITS_LONG", // 2 - "PTRAIN_NUM_SHORT", // 3 - "PTRAIN_NUM_MED", // 4 - "PTRAIN_NUM_LONG", // 5 - "PTRAIN_DOC_SHORT", // 6 - "PTRAIN_DOC_MED", // 7 - "PTRAIN_DOC_LONG", // 8 - "PTRAIN_DICT_SHORT", // 9 - "PTRAIN_DICT_MED", // 10 - "PTRAIN_DICT_LONG", // 11 - "PTRAIN_FREQ_SHORT", // 12 - "PTRAIN_FREQ_MED", // 13 - "PTRAIN_FREQ_LONG", // 14 - "PTRAIN_SHAPE_COST_PER_CHAR", // 15 - "PTRAIN_NGRAM_COST_PER_CHAR", // 16 - "PTRAIN_NUM_BAD_PUNC", // 17 - "PTRAIN_NUM_BAD_CASE", // 18 - "PTRAIN_XHEIGHT_CONSISTENCY", // 19 - "PTRAIN_NUM_BAD_CHAR_TYPE", // 20 - "PTRAIN_NUM_BAD_SPACING", // 21 - "PTRAIN_NUM_BAD_FONT", // 22 - "PTRAIN_RATING_PER_CHAR", // 23 -}; - -// Returns the index of the given feature (by name), -// or -1 meaning the feature is unknown. -int ParamsTrainingFeatureByName(const char *name); - - -// Entry with features extracted from a single OCR hypothesis for a word. -struct ParamsTrainingHypothesis { - ParamsTrainingHypothesis() : cost(0.0) { - memset(features, 0, sizeof(float) * PTRAIN_NUM_FEATURE_TYPES); - } - ParamsTrainingHypothesis(const ParamsTrainingHypothesis &other) { - memcpy(features, other.features, - sizeof(float) * PTRAIN_NUM_FEATURE_TYPES); - str = other.str; - cost = other.cost; - } - float features[PTRAIN_NUM_FEATURE_TYPES]; - STRING str; // string corresponding to word hypothesis (for debugging) - float cost; // path cost computed by segsearch -}; - -// A list of hypotheses explored during one run of segmentation search. -typedef GenericVector ParamsTrainingHypothesisList; - -// A bundle that accumulates all of the hypothesis lists explored during all -// of the runs of segmentation search on a word (e.g. a list of hypotheses -// explored on PASS1, PASS2, fix xheight pass, etc). -class ParamsTrainingBundle { - public: - ParamsTrainingBundle() {} - // Starts a new hypothesis list. - // Should be called at the beginning of a new run of the segmentation search. - void StartHypothesisList() { - hyp_list_vec.push_back(ParamsTrainingHypothesisList()); - } - // Adds a new ParamsTrainingHypothesis to the current hypothesis list - // and returns the reference to the newly added entry. - ParamsTrainingHypothesis &AddHypothesis( - const ParamsTrainingHypothesis &other) { - if (hyp_list_vec.empty()) StartHypothesisList(); - hyp_list_vec.back().push_back(ParamsTrainingHypothesis(other)); - return hyp_list_vec.back().back(); - } - - GenericVector hyp_list_vec; -}; - -} // namespace tesseract - -#endif // TESSERACT_WORDREC_PARAMS_TRAINING_FEATDEF_H_ +/////////////////////////////////////////////////////////////////////// +// File: params_training_featdef.h +// Description: Feature definitions for params training. +// Author: Rika Antonova +// Created: Mon Nov 28 11:26:42 PDT 2011 +// +// (C) Copyright 2011, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +#ifndef TESSERACT_WORDREC_PARAMS_TRAINING_FEATDEF_H_ +#define TESSERACT_WORDREC_PARAMS_TRAINING_FEATDEF_H_ + +#include "genericvector.h" +#include "strngs.h" + +namespace tesseract { + +// Maximum number of unichars in the small and medium sized words +static const int kMaxSmallWordUnichars = 3; +static const int kMaxMediumWordUnichars = 6; + +// Raw features extracted from a single OCR hypothesis. +// The features are normalized (by outline length or number of unichars as +// appropriate) real-valued quantities with unbounded range and +// unknown distribution. +// Normalization / binarization of these features is done at a later stage. +// Note: when adding new fields to this enum make sure to modify +// kParamsTrainingFeatureTypeName +enum kParamsTrainingFeatureType { + // Digits + PTRAIN_DIGITS_SHORT, // 0 + PTRAIN_DIGITS_MED, // 1 + PTRAIN_DIGITS_LONG, // 2 + // Number or pattern (NUMBER_PERM, USER_PATTERN_PERM) + PTRAIN_NUM_SHORT, // 3 + PTRAIN_NUM_MED, // 4 + PTRAIN_NUM_LONG, // 5 + // Document word (DOC_DAWG_PERM) + PTRAIN_DOC_SHORT, // 6 + PTRAIN_DOC_MED, // 7 + PTRAIN_DOC_LONG, // 8 + // Word (SYSTEM_DAWG_PERM, USER_DAWG_PERM, COMPOUND_PERM) + PTRAIN_DICT_SHORT, // 9 + PTRAIN_DICT_MED, // 10 + PTRAIN_DICT_LONG, // 11 + // Frequent word (FREQ_DAWG_PERM) + PTRAIN_FREQ_SHORT, // 12 + PTRAIN_FREQ_MED, // 13 + PTRAIN_FREQ_LONG, // 14 + PTRAIN_SHAPE_COST_PER_CHAR, // 15 + PTRAIN_NGRAM_COST_PER_CHAR, // 16 + PTRAIN_NUM_BAD_PUNC, // 17 + PTRAIN_NUM_BAD_CASE, // 18 + PTRAIN_XHEIGHT_CONSISTENCY, // 19 + PTRAIN_NUM_BAD_CHAR_TYPE, // 20 + PTRAIN_NUM_BAD_SPACING, // 21 + PTRAIN_NUM_BAD_FONT, // 22 + PTRAIN_RATING_PER_CHAR, // 23 + + PTRAIN_NUM_FEATURE_TYPES +}; + +static const char * const kParamsTrainingFeatureTypeName[] = { + "PTRAIN_DIGITS_SHORT", // 0 + "PTRAIN_DIGITS_MED", // 1 + "PTRAIN_DIGITS_LONG", // 2 + "PTRAIN_NUM_SHORT", // 3 + "PTRAIN_NUM_MED", // 4 + "PTRAIN_NUM_LONG", // 5 + "PTRAIN_DOC_SHORT", // 6 + "PTRAIN_DOC_MED", // 7 + "PTRAIN_DOC_LONG", // 8 + "PTRAIN_DICT_SHORT", // 9 + "PTRAIN_DICT_MED", // 10 + "PTRAIN_DICT_LONG", // 11 + "PTRAIN_FREQ_SHORT", // 12 + "PTRAIN_FREQ_MED", // 13 + "PTRAIN_FREQ_LONG", // 14 + "PTRAIN_SHAPE_COST_PER_CHAR", // 15 + "PTRAIN_NGRAM_COST_PER_CHAR", // 16 + "PTRAIN_NUM_BAD_PUNC", // 17 + "PTRAIN_NUM_BAD_CASE", // 18 + "PTRAIN_XHEIGHT_CONSISTENCY", // 19 + "PTRAIN_NUM_BAD_CHAR_TYPE", // 20 + "PTRAIN_NUM_BAD_SPACING", // 21 + "PTRAIN_NUM_BAD_FONT", // 22 + "PTRAIN_RATING_PER_CHAR", // 23 +}; + +// Returns the index of the given feature (by name), +// or -1 meaning the feature is unknown. +int ParamsTrainingFeatureByName(const char *name); + + +// Entry with features extracted from a single OCR hypothesis for a word. +struct ParamsTrainingHypothesis { + ParamsTrainingHypothesis() : cost(0.0) { + memset(features, 0, sizeof(float) * PTRAIN_NUM_FEATURE_TYPES); + } + ParamsTrainingHypothesis(const ParamsTrainingHypothesis &other) { + memcpy(features, other.features, + sizeof(float) * PTRAIN_NUM_FEATURE_TYPES); + str = other.str; + cost = other.cost; + } + float features[PTRAIN_NUM_FEATURE_TYPES]; + STRING str; // string corresponding to word hypothesis (for debugging) + float cost; // path cost computed by segsearch +}; + +// A list of hypotheses explored during one run of segmentation search. +typedef GenericVector ParamsTrainingHypothesisList; + +// A bundle that accumulates all of the hypothesis lists explored during all +// of the runs of segmentation search on a word (e.g. a list of hypotheses +// explored on PASS1, PASS2, fix xheight pass, etc). +class ParamsTrainingBundle { + public: + ParamsTrainingBundle() {} + // Starts a new hypothesis list. + // Should be called at the beginning of a new run of the segmentation search. + void StartHypothesisList() { + hyp_list_vec.push_back(ParamsTrainingHypothesisList()); + } + // Adds a new ParamsTrainingHypothesis to the current hypothesis list + // and returns the reference to the newly added entry. + ParamsTrainingHypothesis &AddHypothesis( + const ParamsTrainingHypothesis &other) { + if (hyp_list_vec.empty()) StartHypothesisList(); + hyp_list_vec.back().push_back(ParamsTrainingHypothesis(other)); + return hyp_list_vec.back().back(); + } + + GenericVector hyp_list_vec; +}; + +} // namespace tesseract + +#endif // TESSERACT_WORDREC_PARAMS_TRAINING_FEATDEF_H_ diff --git a/src/ccstruct/polyaprx.h b/src/ccstruct/polyaprx.h index 1e50d10169..45e3c755af 100644 --- a/src/ccstruct/polyaprx.h +++ b/src/ccstruct/polyaprx.h @@ -1,44 +1,44 @@ -/********************************************************************** - * File: polyaprx.h (Formerly polygon.h) - * Description: Code for polygonal approximation from old edgeprog. - * Author: Ray Smith - * Created: Thu Nov 25 11:42:04 GMT 1993 - * - * (C) Copyright 1993, Hewlett-Packard Ltd. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -#ifndef POLYAPRX_H -#define POLYAPRX_H - -#include "blobs.h" -#include "coutln.h" - -// convert a chain-coded input to the old OUTLINE approximation -TESSLINE* ApproximateOutline(bool allow_detailed_fx, C_OUTLINE *c_outline); -EDGEPT *edgesteps_to_edgepts ( //convert outline -C_OUTLINE * c_outline, //input -EDGEPT edgepts[] //output is array -); -void fix2( //polygonal approx - EDGEPT *start, /*loop to approimate */ - int area); -EDGEPT *poly2( //second poly - EDGEPT *startpt, /*start of loop */ - int area /*area of blob box */ - ); -void cutline( //recursive refine - EDGEPT *first, /*ends of line */ - EDGEPT *last, - int area /*area of object */ - ); -#endif +/********************************************************************** + * File: polyaprx.h (Formerly polygon.h) + * Description: Code for polygonal approximation from old edgeprog. + * Author: Ray Smith + * Created: Thu Nov 25 11:42:04 GMT 1993 + * + * (C) Copyright 1993, Hewlett-Packard Ltd. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +#ifndef POLYAPRX_H +#define POLYAPRX_H + +#include "blobs.h" +#include "coutln.h" + +// convert a chain-coded input to the old OUTLINE approximation +TESSLINE* ApproximateOutline(bool allow_detailed_fx, C_OUTLINE *c_outline); +EDGEPT *edgesteps_to_edgepts ( //convert outline +C_OUTLINE * c_outline, //input +EDGEPT edgepts[] //output is array +); +void fix2( //polygonal approx + EDGEPT *start, /*loop to approimate */ + int area); +EDGEPT *poly2( //second poly + EDGEPT *startpt, /*start of loop */ + int area /*area of blob box */ + ); +void cutline( //recursive refine + EDGEPT *first, /*ends of line */ + EDGEPT *last, + int area /*area of object */ + ); +#endif diff --git a/src/ccstruct/publictypes.cpp b/src/ccstruct/publictypes.cpp index e0c77b25fd..47a1800944 100644 --- a/src/ccstruct/publictypes.cpp +++ b/src/ccstruct/publictypes.cpp @@ -1,40 +1,40 @@ -/////////////////////////////////////////////////////////////////////// -// File: publictypes.cpp -// Description: Types used in both the API and internally -// Author: Ray Smith -// Created: Wed Mar 03 11:17:09 PST 2010 -// -// (C) Copyright 2010, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -#include "publictypes.h" - -/** String name for each block type. Keep in sync with PolyBlockType. */ -const char* kPolyBlockNames[] = { - "Unknown", - "Flowing Text", - "Heading Text", - "Pullout Text", - "Equation", - "Inline Equation", - "Table", - "Vertical Text", - "Caption Text", - "Flowing Image", - "Heading Image", - "Pullout Image", - "Horizontal Line", - "Vertical Line", - "Noise", - "" // End marker for testing that sizes match. -}; +/////////////////////////////////////////////////////////////////////// +// File: publictypes.cpp +// Description: Types used in both the API and internally +// Author: Ray Smith +// Created: Wed Mar 03 11:17:09 PST 2010 +// +// (C) Copyright 2010, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +#include "publictypes.h" + +/** String name for each block type. Keep in sync with PolyBlockType. */ +const char* kPolyBlockNames[] = { + "Unknown", + "Flowing Text", + "Heading Text", + "Pullout Text", + "Equation", + "Inline Equation", + "Table", + "Vertical Text", + "Caption Text", + "Flowing Image", + "Heading Image", + "Pullout Image", + "Horizontal Line", + "Vertical Line", + "Noise", + "" // End marker for testing that sizes match. +}; diff --git a/src/ccstruct/quadlsq.cpp b/src/ccstruct/quadlsq.cpp index 6f19fed678..e0f3169e25 100644 --- a/src/ccstruct/quadlsq.cpp +++ b/src/ccstruct/quadlsq.cpp @@ -1,143 +1,143 @@ -/********************************************************************** - * File: quadlsq.cpp (Formerly qlsq.c) - * Description: Code for least squares approximation of quadratics. - * Author: Ray Smith - * Created: Wed Oct 6 15:14:23 BST 1993 - * - * (C) Copyright 1993, Hewlett-Packard Ltd. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -#include -#include -#include "quadlsq.h" -#include "tprintf.h" - -// Minimum variance in least squares before backing off to a lower degree. -const double kMinVariance = 1.0 / 1024; - -/********************************************************************** - * QLSQ::clear - * - * Function to initialize a QLSQ. - **********************************************************************/ - -void QLSQ::clear() { // initialize - a = 0.0; - b = 0.0; - c = 0.0; - n = 0; // No elements. - sigx = 0.0; // Zero accumulators. - sigy = 0.0; - sigxx = 0.0; - sigxy = 0.0; - sigyy = 0.0; - sigxxx = 0.0; - sigxxy = 0.0; - sigxxxx = 0.0; -} - - -/********************************************************************** - * QLSQ::add - * - * Add an element to the accumulator. - **********************************************************************/ - -void QLSQ::add(double x, double y) { - n++; // Count elements. - sigx += x; // Update accumulators. - sigy += y; - sigxx += x * x; - sigxy += x * y; - sigyy += y * y; - sigxxx += static_cast(x) * x * x; - sigxxy += static_cast(x) * x * y; - sigxxxx += static_cast(x) * x * x * x; -} - - -/********************************************************************** - * QLSQ::remove - * - * Delete an element from the accumulator. - **********************************************************************/ - -void QLSQ::remove(double x, double y) { - if (n <= 0) { - tprintf("Can't remove an element from an empty QLSQ accumulator!\n"); - return; - } - n--; // Count elements. - sigx -= x; // Update accumulators. - sigy -= y; - sigxx -= x * x; - sigxy -= x * y; - sigyy -= y * y; - sigxxx -= static_cast(x) * x * x; - sigxxy -= static_cast(x) * x * y; - sigxxxx -= static_cast(x) * x * x * x; -} - - -/********************************************************************** - * QLSQ::fit - * - * Fit the given degree of polynomial and store the result. - * This creates a quadratic of the form axx + bx + c, but limited to - * the given degree. - **********************************************************************/ - -void QLSQ::fit(int degree) { - long double x_variance = static_cast(sigxx) * n - - static_cast(sigx) * sigx; - - // Note: for computational efficiency, we do not normalize the variance, - // covariance and cube variance here as they are in the same order in both - // nominators and denominators. However, we need be careful in value range - // check. - if (x_variance < kMinVariance * n * n || degree < 1 || n < 2) { - // We cannot calculate b reliably so forget a and b, and just work on c. - a = b = 0.0; - if (n >= 1 && degree >= 0) { - c = sigy / n; - } else { - c = 0.0; - } - return; - } - long double top96 = 0.0; // Accurate top. - long double bottom96 = 0.0; // Accurate bottom. - long double cubevar = sigxxx * n - static_cast(sigxx) * sigx; - long double covariance = static_cast(sigxy) * n - - static_cast(sigx) * sigy; - - if (n >= 4 && degree >= 2) { - top96 = cubevar * covariance; - top96 += x_variance * (static_cast(sigxx) * sigy - sigxxy * n); - - bottom96 = cubevar * cubevar; - bottom96 -= x_variance * - (sigxxxx * n - static_cast(sigxx) * sigxx); - } - if (bottom96 >= kMinVariance * n * n * n * n) { - // Denominators looking good - a = top96 / bottom96; - top96 = covariance - cubevar * a; - b = top96 / x_variance; - } else { - // Forget a, and concentrate on b. - a = 0.0; - b = covariance / x_variance; - } - c = (sigy - a * sigxx - b * sigx) / n; -} +/********************************************************************** + * File: quadlsq.cpp (Formerly qlsq.c) + * Description: Code for least squares approximation of quadratics. + * Author: Ray Smith + * Created: Wed Oct 6 15:14:23 BST 1993 + * + * (C) Copyright 1993, Hewlett-Packard Ltd. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +#include +#include +#include "quadlsq.h" +#include "tprintf.h" + +// Minimum variance in least squares before backing off to a lower degree. +const double kMinVariance = 1.0 / 1024; + +/********************************************************************** + * QLSQ::clear + * + * Function to initialize a QLSQ. + **********************************************************************/ + +void QLSQ::clear() { // initialize + a = 0.0; + b = 0.0; + c = 0.0; + n = 0; // No elements. + sigx = 0.0; // Zero accumulators. + sigy = 0.0; + sigxx = 0.0; + sigxy = 0.0; + sigyy = 0.0; + sigxxx = 0.0; + sigxxy = 0.0; + sigxxxx = 0.0; +} + + +/********************************************************************** + * QLSQ::add + * + * Add an element to the accumulator. + **********************************************************************/ + +void QLSQ::add(double x, double y) { + n++; // Count elements. + sigx += x; // Update accumulators. + sigy += y; + sigxx += x * x; + sigxy += x * y; + sigyy += y * y; + sigxxx += static_cast(x) * x * x; + sigxxy += static_cast(x) * x * y; + sigxxxx += static_cast(x) * x * x * x; +} + + +/********************************************************************** + * QLSQ::remove + * + * Delete an element from the accumulator. + **********************************************************************/ + +void QLSQ::remove(double x, double y) { + if (n <= 0) { + tprintf("Can't remove an element from an empty QLSQ accumulator!\n"); + return; + } + n--; // Count elements. + sigx -= x; // Update accumulators. + sigy -= y; + sigxx -= x * x; + sigxy -= x * y; + sigyy -= y * y; + sigxxx -= static_cast(x) * x * x; + sigxxy -= static_cast(x) * x * y; + sigxxxx -= static_cast(x) * x * x * x; +} + + +/********************************************************************** + * QLSQ::fit + * + * Fit the given degree of polynomial and store the result. + * This creates a quadratic of the form axx + bx + c, but limited to + * the given degree. + **********************************************************************/ + +void QLSQ::fit(int degree) { + long double x_variance = static_cast(sigxx) * n - + static_cast(sigx) * sigx; + + // Note: for computational efficiency, we do not normalize the variance, + // covariance and cube variance here as they are in the same order in both + // nominators and denominators. However, we need be careful in value range + // check. + if (x_variance < kMinVariance * n * n || degree < 1 || n < 2) { + // We cannot calculate b reliably so forget a and b, and just work on c. + a = b = 0.0; + if (n >= 1 && degree >= 0) { + c = sigy / n; + } else { + c = 0.0; + } + return; + } + long double top96 = 0.0; // Accurate top. + long double bottom96 = 0.0; // Accurate bottom. + long double cubevar = sigxxx * n - static_cast(sigxx) * sigx; + long double covariance = static_cast(sigxy) * n - + static_cast(sigx) * sigy; + + if (n >= 4 && degree >= 2) { + top96 = cubevar * covariance; + top96 += x_variance * (static_cast(sigxx) * sigy - sigxxy * n); + + bottom96 = cubevar * cubevar; + bottom96 -= x_variance * + (sigxxxx * n - static_cast(sigxx) * sigxx); + } + if (bottom96 >= kMinVariance * n * n * n * n) { + // Denominators looking good + a = top96 / bottom96; + top96 = covariance - cubevar * a; + b = top96 / x_variance; + } else { + // Forget a, and concentrate on b. + a = 0.0; + b = covariance / x_variance; + } + c = (sigy - a * sigxx - b * sigx) / n; +} diff --git a/src/ccstruct/vecfuncs.cpp b/src/ccstruct/vecfuncs.cpp index 20f34dd02c..86add656dd 100644 --- a/src/ccstruct/vecfuncs.cpp +++ b/src/ccstruct/vecfuncs.cpp @@ -1,63 +1,63 @@ -/* -*-C-*- - ******************************************************************************** - * - * File: vecfuncs.cpp (Formerly vecfuncs.c) - * Description: Blob definition - * Author: Mark Seaman, OCR Technology - * Created: Fri Oct 27 15:39:52 1989 - * Modified: Tue Jul 9 17:44:12 1991 (Mark Seaman) marks@hpgrlt - * Language: C - * Package: N/A - * Status: Experimental (Do Not Distribute) - * - * (c) Copyright 1989, Hewlett-Packard Company. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - ******************************************************************************** - * Revision 5.1 89/07/27 11:47:50 11:47:50 ray () - * Added ratings access methods. - * This version ready for independent development. - */ -/*---------------------------------------------------------------------- - I n c l u d e s -----------------------------------------------------------------------*/ -#include "vecfuncs.h" -#include "blobs.h" - -/*---------------------------------------------------------------------- - F u n c t i o n s -----------------------------------------------------------------------*/ -/********************************************************************** - * direction - * - * Show if the line is going in the positive or negative X direction. - **********************************************************************/ -int direction(EDGEPT *point) { - int dir; /** direction to return **/ - EDGEPT *prev; /** prev point **/ - EDGEPT *next; /** next point **/ - - dir = 0; - prev = point->prev; - next = point->next; - - if (((prev->pos.x <= point->pos.x) && - (point->pos.x < next->pos.x)) || - ((prev->pos.x < point->pos.x) && (point->pos.x <= next->pos.x))) - dir = 1; - - if (((prev->pos.x >= point->pos.x) && - (point->pos.x > next->pos.x)) || - ((prev->pos.x > point->pos.x) && (point->pos.x >= next->pos.x))) - dir = -1; - - return dir; -} +/* -*-C-*- + ******************************************************************************** + * + * File: vecfuncs.cpp (Formerly vecfuncs.c) + * Description: Blob definition + * Author: Mark Seaman, OCR Technology + * Created: Fri Oct 27 15:39:52 1989 + * Modified: Tue Jul 9 17:44:12 1991 (Mark Seaman) marks@hpgrlt + * Language: C + * Package: N/A + * Status: Experimental (Do Not Distribute) + * + * (c) Copyright 1989, Hewlett-Packard Company. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + ******************************************************************************** + * Revision 5.1 89/07/27 11:47:50 11:47:50 ray () + * Added ratings access methods. + * This version ready for independent development. + */ +/*---------------------------------------------------------------------- + I n c l u d e s +----------------------------------------------------------------------*/ +#include "vecfuncs.h" +#include "blobs.h" + +/*---------------------------------------------------------------------- + F u n c t i o n s +----------------------------------------------------------------------*/ +/********************************************************************** + * direction + * + * Show if the line is going in the positive or negative X direction. + **********************************************************************/ +int direction(EDGEPT *point) { + int dir; /** direction to return **/ + EDGEPT *prev; /** prev point **/ + EDGEPT *next; /** next point **/ + + dir = 0; + prev = point->prev; + next = point->next; + + if (((prev->pos.x <= point->pos.x) && + (point->pos.x < next->pos.x)) || + ((prev->pos.x < point->pos.x) && (point->pos.x <= next->pos.x))) + dir = 1; + + if (((prev->pos.x >= point->pos.x) && + (point->pos.x > next->pos.x)) || + ((prev->pos.x > point->pos.x) && (point->pos.x >= next->pos.x))) + dir = -1; + + return dir; +} diff --git a/src/ccstruct/vecfuncs.h b/src/ccstruct/vecfuncs.h index c09d785e15..284e2b5708 100644 --- a/src/ccstruct/vecfuncs.h +++ b/src/ccstruct/vecfuncs.h @@ -1,78 +1,78 @@ -/* -*-C-*- - ******************************************************************************** - * - * File: vecfuncs.h (Formerly vecfuncs.h) - * Description: Vector calculations - * Author: Mark Seaman, OCR Technology - * Created: Wed Dec 20 09:37:18 1989 - * Modified: Tue Jul 9 17:44:37 1991 (Mark Seaman) marks@hpgrlt - * Language: C - * Package: N/A - * Status: Experimental (Do Not Distribute) - * - * (c) Copyright 1989, Hewlett-Packard Company. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - *********************************************************************************/ -#ifndef VECFUNCS_H -#define VECFUNCS_H - -#include - -struct EDGEPT; - -/*---------------------------------------------------------------------- - M a c r o s -----------------------------------------------------------------------*/ -/********************************************************************** - * point_diff - * - * Return the difference from point (p1) to point (p2). Put the value - * into point (p). - **********************************************************************/ - -#define point_diff(p,p1,p2) \ -((p).x = (p1).x - (p2).x, \ - (p).y = (p1).y - (p2).y) - -/********************************************************************** - * CROSS - * - * cross product - **********************************************************************/ - -#define CROSS(a,b) \ -((a).x * (b).y - (a).y * (b).x) - -/********************************************************************** - * SCALAR - * - * scalar vector product - **********************************************************************/ - -#define SCALAR(a,b) \ -((a).x * (b).x + (a).y * (b).y) - -/********************************************************************** - * LENGTH - * - * length of vector - **********************************************************************/ - -#define LENGTH(a) \ -((a).x * (a).x + (a).y * (a).y) - -/*---------------------------------------------------------------------- - F u n c t i o n s -----------------------------------------------------------------------*/ -int direction(EDGEPT *point); - -#endif +/* -*-C-*- + ******************************************************************************** + * + * File: vecfuncs.h (Formerly vecfuncs.h) + * Description: Vector calculations + * Author: Mark Seaman, OCR Technology + * Created: Wed Dec 20 09:37:18 1989 + * Modified: Tue Jul 9 17:44:37 1991 (Mark Seaman) marks@hpgrlt + * Language: C + * Package: N/A + * Status: Experimental (Do Not Distribute) + * + * (c) Copyright 1989, Hewlett-Packard Company. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + *********************************************************************************/ +#ifndef VECFUNCS_H +#define VECFUNCS_H + +#include + +struct EDGEPT; + +/*---------------------------------------------------------------------- + M a c r o s +----------------------------------------------------------------------*/ +/********************************************************************** + * point_diff + * + * Return the difference from point (p1) to point (p2). Put the value + * into point (p). + **********************************************************************/ + +#define point_diff(p,p1,p2) \ +((p).x = (p1).x - (p2).x, \ + (p).y = (p1).y - (p2).y) + +/********************************************************************** + * CROSS + * + * cross product + **********************************************************************/ + +#define CROSS(a,b) \ +((a).x * (b).y - (a).y * (b).x) + +/********************************************************************** + * SCALAR + * + * scalar vector product + **********************************************************************/ + +#define SCALAR(a,b) \ +((a).x * (b).x + (a).y * (b).y) + +/********************************************************************** + * LENGTH + * + * length of vector + **********************************************************************/ + +#define LENGTH(a) \ +((a).x * (a).x + (a).y * (a).y) + +/*---------------------------------------------------------------------- + F u n c t i o n s +----------------------------------------------------------------------*/ +int direction(EDGEPT *point); + +#endif diff --git a/src/ccutil/basedir.h b/src/ccutil/basedir.h index 0b704c6774..60d56ba66d 100644 --- a/src/ccutil/basedir.h +++ b/src/ccutil/basedir.h @@ -1,31 +1,31 @@ -/********************************************************************** - * File: basedir.h (Formerly getpath.h) - * Description: Header file for getpath.c. Provides relocatability of data. - * Author: Ray Smith - * Created: Mon Jul 09 09:13:03 BST 1990 - * - * (C) Copyright 1990, Hewlett-Packard Ltd. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -#ifndef BASEDIR_H -#define BASEDIR_H - -#include "platform.h" -#include "strngs.h" - -// Returns the given code_path truncated to the last slash. -// Useful for getting to the directory of argv[0], but does not search -// any paths. -TESS_API void truncate_path(const char *code_path, STRING* trunc_path); - -#endif +/********************************************************************** + * File: basedir.h (Formerly getpath.h) + * Description: Header file for getpath.c. Provides relocatability of data. + * Author: Ray Smith + * Created: Mon Jul 09 09:13:03 BST 1990 + * + * (C) Copyright 1990, Hewlett-Packard Ltd. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +#ifndef BASEDIR_H +#define BASEDIR_H + +#include "platform.h" +#include "strngs.h" + +// Returns the given code_path truncated to the last slash. +// Useful for getting to the directory of argv[0], but does not search +// any paths. +TESS_API void truncate_path(const char *code_path, STRING* trunc_path); + +#endif diff --git a/src/ccutil/errcode.h b/src/ccutil/errcode.h index 79683d53e5..2f31a7b9ae 100644 --- a/src/ccutil/errcode.h +++ b/src/ccutil/errcode.h @@ -1,103 +1,103 @@ -/********************************************************************** - * File: errcode.h (Formerly error.h) - * Description: Header file for generic error handler class - * Author: Ray Smith - * Created: Tue May 1 16:23:36 BST 1990 - * - * (C) Copyright 1990, Hewlett-Packard Ltd. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -#ifndef ERRCODE_H -#define ERRCODE_H - -#include "host.h" - -/*Control parameters for error()*/ -enum TessErrorLogCode { - DBG = -1, /*log without alert */ - TESSLOG = 0, /*alert user */ - TESSEXIT = 1, /*exit after erro */ - ABORT = 2 /*abort after error */ -}; - -/* Explicit Error Abort codes */ -#define NO_ABORT_CODE 0 -#define LIST_ABORT 1 -#define MEMORY_ABORT 2 -#define FILE_ABORT 3 - -/* Location of code at error codes Reserve 0..2 (status codes 0..23 for UNLV)*/ -#define LOC_UNUSED0 0 -#define LOC_UNUSED1 1 -#define LOC_UNUSED2 2 -#define LOC_INIT 3 -#define LOC_EDGE_PROG 4 -#define LOC_TEXT_ORD_ROWS 5 -#define LOC_TEXT_ORD_WORDS 6 -#define LOC_PASS1 7 -#define LOC_PASS2 8 -/* Reserve up to 8..13 for adding subloc 0/3 plus subsubloc 0/1/2 */ -#define LOC_FUZZY_SPACE 14 -/* Reserve up to 14..20 for adding subloc 0/3 plus subsubloc 0/1/2 */ -#define LOC_MM_ADAPT 21 -#define LOC_DOC_BLK_REJ 22 -#define LOC_WRITE_RESULTS 23 -#define LOC_ADAPTIVE 24 -/* DON'T DEFINE ANY LOCATION > 31 !!! */ - -/* Sub locatation determines whether pass2 was in normal mode or fix xht mode*/ -#define SUBLOC_NORM 0 -#define SUBLOC_FIX_XHT 3 - -/* Sub Sub locatation determines whether match_word_pass2 was in Tess - matcher, NN matcher or somewhere else */ - -#define SUBSUBLOC_OTHER 0 -#define SUBSUBLOC_TESS 1 -#define SUBSUBLOC_NN 2 - -class TESS_API ERRCODE { // error handler class - const char *message; // error message - public: - void error( // error print function - const char *caller, // function location - TessErrorLogCode action, // action to take - const char *format, ... // fprintf format - ) const; - ERRCODE(const char *string) { - message = string; - } // initialize with string -}; - -const ERRCODE ASSERT_FAILED = "Assert failed"; - -#define ASSERT_HOST(x) if (!(x)) \ - { \ - ASSERT_FAILED.error(#x, ABORT, "in file %s, line %d", \ - __FILE__, __LINE__); \ - } - -#define ASSERT_HOST_MSG(x, ...) \ - if (!(x)) { \ - tprintf(__VA_ARGS__); \ - ASSERT_FAILED.error(#x, ABORT, "in file %s, line %d", __FILE__, __LINE__); \ - } - -void signal_exit(int signal_code); - -void set_global_loc_code(int loc_code); - -void set_global_subloc_code(int loc_code); - -void set_global_subsubloc_code(int loc_code); -#endif +/********************************************************************** + * File: errcode.h (Formerly error.h) + * Description: Header file for generic error handler class + * Author: Ray Smith + * Created: Tue May 1 16:23:36 BST 1990 + * + * (C) Copyright 1990, Hewlett-Packard Ltd. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +#ifndef ERRCODE_H +#define ERRCODE_H + +#include "host.h" + +/*Control parameters for error()*/ +enum TessErrorLogCode { + DBG = -1, /*log without alert */ + TESSLOG = 0, /*alert user */ + TESSEXIT = 1, /*exit after erro */ + ABORT = 2 /*abort after error */ +}; + +/* Explicit Error Abort codes */ +#define NO_ABORT_CODE 0 +#define LIST_ABORT 1 +#define MEMORY_ABORT 2 +#define FILE_ABORT 3 + +/* Location of code at error codes Reserve 0..2 (status codes 0..23 for UNLV)*/ +#define LOC_UNUSED0 0 +#define LOC_UNUSED1 1 +#define LOC_UNUSED2 2 +#define LOC_INIT 3 +#define LOC_EDGE_PROG 4 +#define LOC_TEXT_ORD_ROWS 5 +#define LOC_TEXT_ORD_WORDS 6 +#define LOC_PASS1 7 +#define LOC_PASS2 8 +/* Reserve up to 8..13 for adding subloc 0/3 plus subsubloc 0/1/2 */ +#define LOC_FUZZY_SPACE 14 +/* Reserve up to 14..20 for adding subloc 0/3 plus subsubloc 0/1/2 */ +#define LOC_MM_ADAPT 21 +#define LOC_DOC_BLK_REJ 22 +#define LOC_WRITE_RESULTS 23 +#define LOC_ADAPTIVE 24 +/* DON'T DEFINE ANY LOCATION > 31 !!! */ + +/* Sub locatation determines whether pass2 was in normal mode or fix xht mode*/ +#define SUBLOC_NORM 0 +#define SUBLOC_FIX_XHT 3 + +/* Sub Sub locatation determines whether match_word_pass2 was in Tess + matcher, NN matcher or somewhere else */ + +#define SUBSUBLOC_OTHER 0 +#define SUBSUBLOC_TESS 1 +#define SUBSUBLOC_NN 2 + +class TESS_API ERRCODE { // error handler class + const char *message; // error message + public: + void error( // error print function + const char *caller, // function location + TessErrorLogCode action, // action to take + const char *format, ... // fprintf format + ) const; + ERRCODE(const char *string) { + message = string; + } // initialize with string +}; + +const ERRCODE ASSERT_FAILED = "Assert failed"; + +#define ASSERT_HOST(x) if (!(x)) \ + { \ + ASSERT_FAILED.error(#x, ABORT, "in file %s, line %d", \ + __FILE__, __LINE__); \ + } + +#define ASSERT_HOST_MSG(x, ...) \ + if (!(x)) { \ + tprintf(__VA_ARGS__); \ + ASSERT_FAILED.error(#x, ABORT, "in file %s, line %d", __FILE__, __LINE__); \ + } + +void signal_exit(int signal_code); + +void set_global_loc_code(int loc_code); + +void set_global_subloc_code(int loc_code); + +void set_global_subsubloc_code(int loc_code); +#endif diff --git a/src/ccutil/fileerr.h b/src/ccutil/fileerr.h index 991df6d751..d3b6993d21 100644 --- a/src/ccutil/fileerr.h +++ b/src/ccutil/fileerr.h @@ -1,34 +1,34 @@ -/********************************************************************** - * File: fileerr.h (Formerly filerr.h) - * Description: Errors for file utilities. - * Author: Ray Smith - * Created: Tue Aug 14 15:45:16 BST 1990 - * - * (C) Copyright 1990, Hewlett-Packard Ltd. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -#ifndef FILEERR_H -#define FILEERR_H - -#include "errcode.h" - -const ERRCODE CANTOPENFILE = "Can't open file"; -const ERRCODE CANTCREATEFILE = "Can't create file"; -const ERRCODE CANTMAKEPIPE = "Can't create pipe"; -const ERRCODE CANTCONNECTPIPE = "Can't reconnect pipes to stdin/stdout"; -const ERRCODE READFAILED = "Read of file failed"; -const ERRCODE WRITEFAILED = "Write of file failed"; -const ERRCODE SELECTFAILED = "Select failed"; - -const ERRCODE EXECFAILED = "Could not exec new process"; -#endif +/********************************************************************** + * File: fileerr.h (Formerly filerr.h) + * Description: Errors for file utilities. + * Author: Ray Smith + * Created: Tue Aug 14 15:45:16 BST 1990 + * + * (C) Copyright 1990, Hewlett-Packard Ltd. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +#ifndef FILEERR_H +#define FILEERR_H + +#include "errcode.h" + +const ERRCODE CANTOPENFILE = "Can't open file"; +const ERRCODE CANTCREATEFILE = "Can't create file"; +const ERRCODE CANTMAKEPIPE = "Can't create pipe"; +const ERRCODE CANTCONNECTPIPE = "Can't reconnect pipes to stdin/stdout"; +const ERRCODE READFAILED = "Read of file failed"; +const ERRCODE WRITEFAILED = "Write of file failed"; +const ERRCODE SELECTFAILED = "Select failed"; + +const ERRCODE EXECFAILED = "Could not exec new process"; +#endif diff --git a/src/ccutil/globaloc.h b/src/ccutil/globaloc.h index 3b24ae515d..1118fbc94b 100644 --- a/src/ccutil/globaloc.h +++ b/src/ccutil/globaloc.h @@ -1,39 +1,39 @@ -/********************************************************************** - * File: globaloc.h (Formerly error.h) - * Description: Header file for generic error handler class - * Author: Ray Smith - * Created: Tue May 1 16:23:36 BST 1990 - * - * (C) Copyright 1990, Hewlett-Packard Ltd. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -#ifndef GLOBALOC_H -#define GLOBALOC_H - -#include "host.h" - -// Saves a clone of the given pix, and notes its resolution in thread-specific -// data, so that the image can be written prior to a crash. -struct Pix; -void SavePixForCrash(int resolution, Pix* pix); - -void signal_exit(int signal_code); - -void err_exit(); - -void set_global_loc_code(int loc_code); - -void set_global_subloc_code(int loc_code); - -void set_global_subsubloc_code(int loc_code); -#endif +/********************************************************************** + * File: globaloc.h (Formerly error.h) + * Description: Header file for generic error handler class + * Author: Ray Smith + * Created: Tue May 1 16:23:36 BST 1990 + * + * (C) Copyright 1990, Hewlett-Packard Ltd. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +#ifndef GLOBALOC_H +#define GLOBALOC_H + +#include "host.h" + +// Saves a clone of the given pix, and notes its resolution in thread-specific +// data, so that the image can be written prior to a crash. +struct Pix; +void SavePixForCrash(int resolution, Pix* pix); + +void signal_exit(int signal_code); + +void err_exit(); + +void set_global_loc_code(int loc_code); + +void set_global_subloc_code(int loc_code); + +void set_global_subsubloc_code(int loc_code); +#endif diff --git a/src/ccutil/ndminx.h b/src/ccutil/ndminx.h index 67fcebe0d2..9eee76c028 100644 --- a/src/ccutil/ndminx.h +++ b/src/ccutil/ndminx.h @@ -1,31 +1,31 @@ -/********************************************************************** - * File: ndminx.h (Formerly ndminmax.h) - * Description: Extended ascii chars - * Author: Phil Cheatle - * Created: Mon Mar 29 14:46:01 BST 1993 - * - * (C) Copyright 1991, Hewlett-Packard Ltd. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -#ifndef NDMINX_H -#define NDMINX_H - -#ifndef MAX -#define MAX(x,y) (((x) >= (y))?(x):(y)) -#endif - -#ifndef MIN -#define MIN(x,y) (((x) <= (y))?(x):(y)) -#endif - -#endif +/********************************************************************** + * File: ndminx.h (Formerly ndminmax.h) + * Description: Extended ascii chars + * Author: Phil Cheatle + * Created: Mon Mar 29 14:46:01 BST 1993 + * + * (C) Copyright 1991, Hewlett-Packard Ltd. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +#ifndef NDMINX_H +#define NDMINX_H + +#ifndef MAX +#define MAX(x,y) (((x) >= (y))?(x):(y)) +#endif + +#ifndef MIN +#define MIN(x,y) (((x) <= (y))?(x):(y)) +#endif + +#endif diff --git a/src/ccutil/qrsequence.h b/src/ccutil/qrsequence.h index d365ad31a3..d49d755028 100644 --- a/src/ccutil/qrsequence.h +++ b/src/ccutil/qrsequence.h @@ -1,80 +1,80 @@ -/////////////////////////////////////////////////////////////////////// -// File: qrsequence.h -// Description: Quasi-random sequence generator class. -// Author: Ranjith Unnikrishnan -// Created: Wed May 20 2009 -// -// Class to generate a (deterministic) quasi-random Van der Corput sequence that -// covers the interval [0,N) without repetition. -// -// The sequence is generated by reversing the base-2 representation of the -// sequence of natural numbers {0, 1,... M-1}, where M is 2^{num_bits_} and -// num_bits is the minimum number of bits required to represent N. If a reversed -// numbers is >= N it is rejected and the next natural number is considered -// until a valid output number is found. -// -// (C) Copyright 2009, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); you may not -// use this file except in compliance with the License. You may obtain a copy -// of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required -// by applicable law or agreed to in writing, software distributed under the -// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS -// OF ANY KIND, either express or implied. See the License for the specific -// language governing permissions and limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -#ifndef TESSERACT_CCUTIL_QRSEQUENCE_H_ -#define TESSERACT_CCUTIL_QRSEQUENCE_H_ - -#include - -class QRSequenceGenerator { - public: - // Object is initalized with the size of the output range. - explicit QRSequenceGenerator(int N) : N_(N), next_num_(0) { - num_bits_ = static_cast(ceil(log(static_cast(N)) / log(2.0))); - } - - // Main worker method that retrieves the next number in the sequence. - // Returns kInvalidVal if called more than N times after object initialization - int GetVal() { - const int kInvalidVal = -1; - const int kMaxNaturalNumberValue = 1 << num_bits_; - if (next_num_ >= kMaxNaturalNumberValue) - return kInvalidVal; - int n = next_num_; - - while (next_num_ < kMaxNaturalNumberValue) { - n = GetBinaryReversedInteger(next_num_++); - if (n < N_) break; - } - return (next_num_ > kMaxNaturalNumberValue) ? kInvalidVal : n; - } - - protected: - // Outputs the integer formed by reversing the bits of the input integer. Only - // the lowest num_bits_ bits of the input integer are reversed. - int GetBinaryReversedInteger(int in_val) const { - int bit_pos = num_bits_; - int out_val = 0; - while(bit_pos--) { - // Set the value of the last bit. - out_val |= (in_val & 0x1); - if (bit_pos > 0) { - // Left-shift output value to prepare for storing the next bit. - out_val <<= 1; - } - // Right-shift input value to prepare for retrieving the next bit. - in_val >>= 1; - } - return out_val; - } - int N_; - // Next number to be considered for reversal and output. - int next_num_; - // number of bits required to represent the numbers of the sequence - int num_bits_; -}; - -#endif // TESSERACT_CCUTIL_QRSEQUENCE_H_ +/////////////////////////////////////////////////////////////////////// +// File: qrsequence.h +// Description: Quasi-random sequence generator class. +// Author: Ranjith Unnikrishnan +// Created: Wed May 20 2009 +// +// Class to generate a (deterministic) quasi-random Van der Corput sequence that +// covers the interval [0,N) without repetition. +// +// The sequence is generated by reversing the base-2 representation of the +// sequence of natural numbers {0, 1,... M-1}, where M is 2^{num_bits_} and +// num_bits is the minimum number of bits required to represent N. If a reversed +// numbers is >= N it is rejected and the next natural number is considered +// until a valid output number is found. +// +// (C) Copyright 2009, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy +// of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required +// by applicable law or agreed to in writing, software distributed under the +// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS +// OF ANY KIND, either express or implied. See the License for the specific +// language governing permissions and limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +#ifndef TESSERACT_CCUTIL_QRSEQUENCE_H_ +#define TESSERACT_CCUTIL_QRSEQUENCE_H_ + +#include + +class QRSequenceGenerator { + public: + // Object is initalized with the size of the output range. + explicit QRSequenceGenerator(int N) : N_(N), next_num_(0) { + num_bits_ = static_cast(ceil(log(static_cast(N)) / log(2.0))); + } + + // Main worker method that retrieves the next number in the sequence. + // Returns kInvalidVal if called more than N times after object initialization + int GetVal() { + const int kInvalidVal = -1; + const int kMaxNaturalNumberValue = 1 << num_bits_; + if (next_num_ >= kMaxNaturalNumberValue) + return kInvalidVal; + int n = next_num_; + + while (next_num_ < kMaxNaturalNumberValue) { + n = GetBinaryReversedInteger(next_num_++); + if (n < N_) break; + } + return (next_num_ > kMaxNaturalNumberValue) ? kInvalidVal : n; + } + + protected: + // Outputs the integer formed by reversing the bits of the input integer. Only + // the lowest num_bits_ bits of the input integer are reversed. + int GetBinaryReversedInteger(int in_val) const { + int bit_pos = num_bits_; + int out_val = 0; + while(bit_pos--) { + // Set the value of the last bit. + out_val |= (in_val & 0x1); + if (bit_pos > 0) { + // Left-shift output value to prepare for storing the next bit. + out_val <<= 1; + } + // Right-shift input value to prepare for retrieving the next bit. + in_val >>= 1; + } + return out_val; + } + int N_; + // Next number to be considered for reversal and output. + int next_num_; + // number of bits required to represent the numbers of the sequence + int num_bits_; +}; + +#endif // TESSERACT_CCUTIL_QRSEQUENCE_H_ diff --git a/src/ccutil/scanutils.h b/src/ccutil/scanutils.h index 1b5b2a3a8c..1dc347221a 100644 --- a/src/ccutil/scanutils.h +++ b/src/ccutil/scanutils.h @@ -1,67 +1,67 @@ -// Copyright 2006 Google Inc. -// All Rights Reserved. -// Author: renn -// -// Contains file io functions (mainly for file parsing), that might not be -// available, on embedded devices, or that have an incomplete implementation -// there. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef TESSERACT_CCUTIL_SCANUTILS_H_ -#define TESSERACT_CCUTIL_SCANUTILS_H_ - -#include -#include -#include -#include - -/** - * fscanf variant to ensure correct reading regardless of locale. - * - * tfscanf parse a file stream according to the given format. See the fscanf - * manpage for more information, as this function attempts to mimic its - * behavior. - * - * @note Note that scientific floating-point notation is not supported. - * - */ -int tfscanf(FILE* stream, const char *format, ...); - -#ifdef EMBEDDED - -// Attempts to parse the given file stream s as an integer of the base -// 'base'. Returns the first successfully parsed integer as a uintmax_t, or -// 0, if none was found. -uintmax_t streamtoumax(FILE* s, int base); - -// Parse a file stream according to the given format. See the fscanf manpage -// for more information, as this function attempts to mimic its behavior. -// Note that scientific loating-point notation is not supported. -int fscanf(FILE* stream, const char *format, ...); - -// Parse a file stream according to the given format. See the fscanf manpage -// for more information, as this function attempts to mimic its behavior. -// Note that scientific loating-point notation is not supported. -int vfscanf(FILE* stream, const char *format, va_list ap); - -// Create a file at the specified path. See the creat manpage for more -// information, as this function attempts to mimic its behavior. -int creat(const char *pathname, mode_t mode); - -// Convert the specified C-String to a float. Returns the first parsed float, -// or 0.0 if no floating point value could be found. Note that scientific -// floating-point notation is not supported. -double strtofloat(const char* s); - -#endif // EMBEDDED - -#endif // TESSERACT_CCUTIL_SCANUTILS_H_ +// Copyright 2006 Google Inc. +// All Rights Reserved. +// Author: renn +// +// Contains file io functions (mainly for file parsing), that might not be +// available, on embedded devices, or that have an incomplete implementation +// there. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef TESSERACT_CCUTIL_SCANUTILS_H_ +#define TESSERACT_CCUTIL_SCANUTILS_H_ + +#include +#include +#include +#include + +/** + * fscanf variant to ensure correct reading regardless of locale. + * + * tfscanf parse a file stream according to the given format. See the fscanf + * manpage for more information, as this function attempts to mimic its + * behavior. + * + * @note Note that scientific floating-point notation is not supported. + * + */ +int tfscanf(FILE* stream, const char *format, ...); + +#ifdef EMBEDDED + +// Attempts to parse the given file stream s as an integer of the base +// 'base'. Returns the first successfully parsed integer as a uintmax_t, or +// 0, if none was found. +uintmax_t streamtoumax(FILE* s, int base); + +// Parse a file stream according to the given format. See the fscanf manpage +// for more information, as this function attempts to mimic its behavior. +// Note that scientific loating-point notation is not supported. +int fscanf(FILE* stream, const char *format, ...); + +// Parse a file stream according to the given format. See the fscanf manpage +// for more information, as this function attempts to mimic its behavior. +// Note that scientific loating-point notation is not supported. +int vfscanf(FILE* stream, const char *format, va_list ap); + +// Create a file at the specified path. See the creat manpage for more +// information, as this function attempts to mimic its behavior. +int creat(const char *pathname, mode_t mode); + +// Convert the specified C-String to a float. Returns the first parsed float, +// or 0.0 if no floating point value could be found. Note that scientific +// floating-point notation is not supported. +double strtofloat(const char* s); + +#endif // EMBEDDED + +#endif // TESSERACT_CCUTIL_SCANUTILS_H_ diff --git a/src/ccutil/stderr.h b/src/ccutil/stderr.h index ab396505c0..b5e96fbe7c 100644 --- a/src/ccutil/stderr.h +++ b/src/ccutil/stderr.h @@ -1,26 +1,26 @@ -/********************************************************************** - * File: stderr.h (Formerly stderrs.h) - * Description: File defining error messages fundamental of commonly used. - * Author: Ray Smith - * Created: Fri Aug 10 15:23:14 BST 1990 - * - * (C) Copyright 1990, Hewlett-Packard Ltd. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -#ifndef STDERR_H -#define STDERR_H - -#include "errcode.h" - -const ERRCODE MEMORY_OUT = "Out of memory"; -#endif +/********************************************************************** + * File: stderr.h (Formerly stderrs.h) + * Description: File defining error messages fundamental of commonly used. + * Author: Ray Smith + * Created: Fri Aug 10 15:23:14 BST 1990 + * + * (C) Copyright 1990, Hewlett-Packard Ltd. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +#ifndef STDERR_H +#define STDERR_H + +#include "errcode.h" + +const ERRCODE MEMORY_OUT = "Out of memory"; +#endif diff --git a/src/ccutil/tprintf.h b/src/ccutil/tprintf.h index eed4af4529..27a3382369 100644 --- a/src/ccutil/tprintf.h +++ b/src/ccutil/tprintf.h @@ -1,36 +1,36 @@ -/********************************************************************** - * File: tprintf.h - * Description: Trace version of printf - portable between UX and NT - * Author: Phil Cheatle - * Created: Wed Jun 28 15:01:15 BST 1995 - * - * (C) Copyright 1995, Hewlett-Packard Ltd. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -#ifndef TESSERACT_CCUTIL_TPRINTF_H -#define TESSERACT_CCUTIL_TPRINTF_H - -#include "params.h" - -extern DLLSYM STRING_VAR_H(debug_file, "", - "File to send tprintf output to"); -extern DLLSYM BOOL_VAR_H(debug_window_on, TRUE, - "Send tprintf to window unless file set"); - -// Main logging function. -#define tprintf(...) tprintf_internal(__VA_ARGS__) - -extern TESS_API void tprintf_internal( // Trace printf - const char *format, ...); // Message - -#endif // define TESSERACT_CCUTIL_TPRINTF_H +/********************************************************************** + * File: tprintf.h + * Description: Trace version of printf - portable between UX and NT + * Author: Phil Cheatle + * Created: Wed Jun 28 15:01:15 BST 1995 + * + * (C) Copyright 1995, Hewlett-Packard Ltd. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +#ifndef TESSERACT_CCUTIL_TPRINTF_H +#define TESSERACT_CCUTIL_TPRINTF_H + +#include "params.h" + +extern DLLSYM STRING_VAR_H(debug_file, "", + "File to send tprintf output to"); +extern DLLSYM BOOL_VAR_H(debug_window_on, TRUE, + "Send tprintf to window unless file set"); + +// Main logging function. +#define tprintf(...) tprintf_internal(__VA_ARGS__) + +extern TESS_API void tprintf_internal( // Trace printf + const char *format, ...); // Message + +#endif // define TESSERACT_CCUTIL_TPRINTF_H diff --git a/src/ccutil/unicharmap.h b/src/ccutil/unicharmap.h index bd80f16a37..45170c4f2c 100644 --- a/src/ccutil/unicharmap.h +++ b/src/ccutil/unicharmap.h @@ -1,73 +1,73 @@ -/////////////////////////////////////////////////////////////////////// -// File: unicharmap.h -// Description: Unicode character/ligature to integer id class. -// Author: Thomas Kielbus -// Created: Wed Jun 28 17:05:01 PDT 2006 -// -// (C) Copyright 2006, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -#ifndef TESSERACT_CCUTIL_UNICHARMAP_H_ -#define TESSERACT_CCUTIL_UNICHARMAP_H_ - -#include "unichar.h" - -// A UNICHARMAP stores unique unichars. Each of them is associated with one -// UNICHAR_ID. -class UNICHARMAP { - public: - - // Create an empty UNICHARMAP - UNICHARMAP(); - - ~UNICHARMAP(); - - // Insert the given unichar represention in the UNICHARMAP and associate it - // with the given id. The length of the representation MUST be non-zero. - void insert(const char* const unichar_repr, UNICHAR_ID id); - - // Return the id associated with the given unichar representation, - // this representation MUST exist within the UNICHARMAP. The first - // length characters (maximum) from unichar_repr are used. The length - // MUST be non-zero. - UNICHAR_ID unichar_to_id(const char* const unichar_repr, int length) const; - - // Return true if the given unichar representation is already present in the - // UNICHARMAP. The first length characters (maximum) from unichar_repr are - // used. The length MUST be non-zero. - bool contains(const char* const unichar_repr, int length) const; - - // Return the minimum number of characters that must be used from this string - // to obtain a match in the UNICHARMAP. - int minmatch(const char* const unichar_repr) const; - - // Clear the UNICHARMAP. All previous data is lost. - void clear(); - - private: - - // The UNICHARMAP is represented as a tree whose nodes are of type - // UNICHARMAP_NODE. - struct UNICHARMAP_NODE { - - UNICHARMAP_NODE(); - ~UNICHARMAP_NODE(); - - UNICHARMAP_NODE* children; - UNICHAR_ID id; - }; - - UNICHARMAP_NODE* nodes; -}; - -#endif // TESSERACT_CCUTIL_UNICHARMAP_H_ +/////////////////////////////////////////////////////////////////////// +// File: unicharmap.h +// Description: Unicode character/ligature to integer id class. +// Author: Thomas Kielbus +// Created: Wed Jun 28 17:05:01 PDT 2006 +// +// (C) Copyright 2006, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +#ifndef TESSERACT_CCUTIL_UNICHARMAP_H_ +#define TESSERACT_CCUTIL_UNICHARMAP_H_ + +#include "unichar.h" + +// A UNICHARMAP stores unique unichars. Each of them is associated with one +// UNICHAR_ID. +class UNICHARMAP { + public: + + // Create an empty UNICHARMAP + UNICHARMAP(); + + ~UNICHARMAP(); + + // Insert the given unichar represention in the UNICHARMAP and associate it + // with the given id. The length of the representation MUST be non-zero. + void insert(const char* const unichar_repr, UNICHAR_ID id); + + // Return the id associated with the given unichar representation, + // this representation MUST exist within the UNICHARMAP. The first + // length characters (maximum) from unichar_repr are used. The length + // MUST be non-zero. + UNICHAR_ID unichar_to_id(const char* const unichar_repr, int length) const; + + // Return true if the given unichar representation is already present in the + // UNICHARMAP. The first length characters (maximum) from unichar_repr are + // used. The length MUST be non-zero. + bool contains(const char* const unichar_repr, int length) const; + + // Return the minimum number of characters that must be used from this string + // to obtain a match in the UNICHARMAP. + int minmatch(const char* const unichar_repr) const; + + // Clear the UNICHARMAP. All previous data is lost. + void clear(); + + private: + + // The UNICHARMAP is represented as a tree whose nodes are of type + // UNICHARMAP_NODE. + struct UNICHARMAP_NODE { + + UNICHARMAP_NODE(); + ~UNICHARMAP_NODE(); + + UNICHARMAP_NODE* children; + UNICHAR_ID id; + }; + + UNICHARMAP_NODE* nodes; +}; + +#endif // TESSERACT_CCUTIL_UNICHARMAP_H_ diff --git a/src/ccutil/unicodes.h b/src/ccutil/unicodes.h index e76230b46b..7bab9b0059 100644 --- a/src/ccutil/unicodes.h +++ b/src/ccutil/unicodes.h @@ -1,39 +1,39 @@ -/********************************************************************** - * File: unicodes.h - * Description: Unicode related machinery - * Author: David Eger - * Created: Wed Jun 15 16:37:50 PST 2011 - * - * (C) Copyright 2011, Google, Inc. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -#ifndef TESSERACT_CCUTIL_UNICODES_H_ -#define TESSERACT_CCUTIL_UNICODES_H_ - -namespace tesseract { - -extern const char *kUTF8LineSeparator; -extern const char *kUTF8ParagraphSeparator; -extern const char *kLRM; //< Left-to-Right Mark -extern const char *kRLM; //< Right-to-Left Mark -extern const char *kRLE; //< Right-to-Left Embedding -extern const char *kPDF; //< Pop Directional Formatting - -/// The following are confusable internal word punctuation symbols -/// which we normalize to the first variant when matching in dawgs. -extern const char *kHyphenLikeUTF8[]; -extern const char *kApostropheLikeUTF8[]; - -} // namespace - -#endif // TESSERACT_CCUTIL_UNICODES_H_ +/********************************************************************** + * File: unicodes.h + * Description: Unicode related machinery + * Author: David Eger + * Created: Wed Jun 15 16:37:50 PST 2011 + * + * (C) Copyright 2011, Google, Inc. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +#ifndef TESSERACT_CCUTIL_UNICODES_H_ +#define TESSERACT_CCUTIL_UNICODES_H_ + +namespace tesseract { + +extern const char *kUTF8LineSeparator; +extern const char *kUTF8ParagraphSeparator; +extern const char *kLRM; //< Left-to-Right Mark +extern const char *kRLM; //< Right-to-Left Mark +extern const char *kRLE; //< Right-to-Left Embedding +extern const char *kPDF; //< Pop Directional Formatting + +/// The following are confusable internal word punctuation symbols +/// which we normalize to the first variant when matching in dawgs. +extern const char *kHyphenLikeUTF8[]; +extern const char *kApostropheLikeUTF8[]; + +} // namespace + +#endif // TESSERACT_CCUTIL_UNICODES_H_ diff --git a/src/ccutil/universalambigs.cpp b/src/ccutil/universalambigs.cpp index 9d82845737..aa03c845bf 100644 --- a/src/ccutil/universalambigs.cpp +++ b/src/ccutil/universalambigs.cpp @@ -1,19021 +1,19021 @@ -/////////////////////////////////////////////////////////////////////// -// File: universalambigs.cpp -// Description: Data for a universal ambigs file that is useful for -// any language. -// Author: Ray Smith -// Created: Mon Mar 18 11:26:00 PDT 2013 -// -// (C) Copyright 2013, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -namespace tesseract { - -extern const char kUniversalAmbigsFile[] = { - '\166', '\062', '\012', '\047', '\047', '\040', '\042', '\040', '\061', - '\012', '\140', '\047', '\040', '\042', '\040', '\061', '\012', '\047', - '\140', '\040', '\042', '\040', '\061', '\012', '\342', '\200', '\230', - '\047', '\040', '\042', '\040', '\061', '\012', '\047', '\342', '\200', - '\230', '\040', '\042', '\040', '\061', '\012', '\342', '\200', '\231', - '\047', '\040', '\042', '\040', '\061', '\012', '\047', '\342', '\200', - '\231', '\040', '\042', '\040', '\061', '\012', '\140', '\140', '\040', - '\042', '\040', '\061', '\012', '\140', '\342', '\200', '\230', '\040', - '\042', '\040', '\061', '\012', '\342', '\200', '\230', '\140', '\040', - '\042', '\040', '\061', '\012', '\140', '\342', '\200', '\231', '\040', - '\042', '\040', '\061', '\012', '\342', '\200', '\231', '\140', '\040', - '\042', '\040', '\061', '\012', '\342', '\200', '\230', '\342', '\200', - '\230', '\040', '\342', '\200', '\234', '\040', '\061', '\012', '\342', - '\200', '\230', '\342', '\200', '\231', '\040', '\042', '\040', '\061', - '\012', '\342', '\200', '\231', '\342', '\200', '\230', '\040', '\042', - '\040', '\061', '\012', '\342', '\200', '\231', '\342', '\200', '\231', - '\040', '\342', '\200', '\235', '\040', '\061', '\012', '\054', '\054', - '\040', '\342', '\200', '\236', '\040', '\061', '\012', '\155', '\040', - '\162', '\156', '\040', '\060', '\012', '\162', '\156', '\040', '\155', - '\040', '\060', '\012', '\155', '\040', '\151', '\156', '\040', '\060', - '\012', '\151', '\156', '\040', '\155', '\040', '\060', '\012', '\144', - '\040', '\143', '\154', '\040', '\060', '\012', '\143', '\154', '\040', - '\144', '\040', '\060', '\012', '\156', '\156', '\040', '\162', '\155', - '\040', '\060', '\012', '\162', '\155', '\040', '\156', '\156', '\040', - '\060', '\012', '\156', '\040', '\162', '\151', '\040', '\060', '\012', - '\162', '\151', '\040', '\156', '\040', '\060', '\012', '\154', '\151', - '\040', '\150', '\040', '\060', '\012', '\154', '\162', '\040', '\150', - '\040', '\060', '\012', '\151', '\151', '\040', '\165', '\040', '\060', - '\012', '\151', '\151', '\040', '\156', '\040', '\060', '\012', '\156', - '\151', '\040', '\155', '\040', '\060', '\012', '\151', '\151', '\151', - '\040', '\155', '\040', '\060', '\012', '\154', '\154', '\040', '\110', - '\040', '\060', '\012', '\111', '\055', '\111', '\040', '\110', '\040', - '\060', '\012', '\166', '\166', '\040', '\167', '\040', '\060', '\012', - '\126', '\126', '\040', '\127', '\040', '\060', '\012', '\164', '\040', - '\146', '\040', '\060', '\012', '\146', '\040', '\164', '\040', '\060', - '\012', '\141', '\040', '\157', '\040', '\060', '\012', '\157', '\040', - '\141', '\040', '\060', '\012', '\145', '\040', '\143', '\040', '\060', - '\012', '\143', '\040', '\145', '\040', '\060', '\012', '\162', '\162', - '\040', '\156', '\040', '\060', '\012', '\105', '\040', '\146', '\151', - '\040', '\060', '\012', '\154', '\074', '\040', '\153', '\040', '\060', - '\012', '\154', '\144', '\040', '\153', '\151', '\040', '\060', '\012', - '\154', '\170', '\040', '\150', '\040', '\060', '\012', '\170', '\156', - '\040', '\155', '\040', '\060', '\012', '\165', '\170', '\040', '\151', - '\156', '\040', '\060', '\012', '\162', '\040', '\164', '\040', '\060', - '\012', '\144', '\040', '\164', '\154', '\040', '\060', '\012', '\144', - '\151', '\040', '\164', '\150', '\040', '\060', '\012', '\165', '\162', - '\040', '\151', '\156', '\040', '\060', '\012', '\165', '\156', '\040', - '\151', '\155', '\040', '\060', '\012', '\165', '\040', '\141', '\040', - '\060', '\012', '\157', '\040', '\303', '\263', '\040', '\060', '\012', - '\303', '\263', '\040', '\157', '\040', '\060', '\012', '\151', '\040', - '\303', '\255', '\040', '\060', '\012', '\303', '\255', '\040', '\151', - '\040', '\060', '\012', '\141', '\040', '\303', '\241', '\040', '\060', - '\012', '\303', '\241', '\040', '\141', '\040', '\060', '\012', '\145', - '\040', '\303', '\251', '\040', '\060', '\012', '\303', '\251', '\040', - '\145', '\040', '\060', '\012', '\165', '\040', '\303', '\272', '\040', - '\060', '\012', '\303', '\272', '\040', '\165', '\040', '\060', '\012', - '\156', '\040', '\303', '\261', '\040', '\060', '\012', '\303', '\261', - '\040', '\156', '\040', '\060', '\012', '\060', '\040', '\157', '\040', - '\060', '\012', '\144', '\040', '\164', '\162', '\040', '\060', '\012', - '\156', '\040', '\164', '\162', '\040', '\060', '\012', '\303', '\261', - '\040', '\146', '\151', '\040', '\060', '\012', '\165', '\040', '\164', - '\151', '\040', '\060', '\012', '\303', '\261', '\040', '\164', '\151', - '\040', '\060', '\012', '\144', '\040', '\164', '\151', '\040', '\060', - '\012', '\144', '\040', '\164', '\303', '\255', '\040', '\060', '\012', - '\144', '\040', '\162', '\303', '\255', '\040', '\060', '\012', '\141', - '\040', '\303', '\240', '\040', '\060', '\012', '\145', '\040', '\303', - '\250', '\040', '\060', '\012', '\156', '\040', '\151', '\152', '\040', - '\060', '\012', '\147', '\040', '\151', '\152', '\040', '\060', '\012', - '\157', '\040', '\303', '\262', '\040', '\060', '\012', '\105', '\040', - '\303', '\211', '\040', '\060', '\012', '\105', '\040', '\303', '\210', - '\040', '\060', '\012', '\165', '\040', '\303', '\274', '\040', '\060', - '\012', '\170', '\156', '\105', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\131', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\164', '\105', '\040', '\156', '\164', '\040', '\061', - '\012', '\124', '\154', '\142', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\170', '\116', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\152', '\121', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\160', '\106', '\040', '\151', '\152', '\040', '\061', - '\012', '\131', '\162', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\141', '\161', '\131', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\166', '\112', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\142', '\114', '\040', '\142', '\145', '\040', '\061', - '\012', '\116', '\166', '\153', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\112', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\167', '\170', '\103', '\040', '\167', '\141', '\040', '\061', - '\012', '\143', '\165', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\172', '\164', '\040', '\164', '\141', '\040', '\061', - '\012', '\161', '\113', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\163', '\143', '\112', '\040', '\163', '\164', '\040', '\061', - '\012', '\160', '\130', '\160', '\040', '\160', '\157', '\040', '\061', - '\012', '\126', '\161', '\151', '\040', '\164', '\151', '\040', '\061', - '\012', '\125', '\170', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\153', '\112', '\166', '\040', '\153', '\141', '\040', '\061', - '\012', '\131', '\153', '\144', '\040', '\153', '\141', '\040', '\061', - '\012', '\166', '\160', '\130', '\040', '\166', '\141', '\040', '\061', - '\012', '\151', '\102', '\166', '\040', '\164', '\151', '\040', '\061', - '\012', '\172', '\122', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\124', '\155', '\040', '\155', '\151', '\040', '\061', - '\012', '\155', '\113', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\126', '\172', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\164', '\160', '\040', '\164', '\151', '\040', '\061', - '\012', '\155', '\166', '\104', '\040', '\166', '\141', '\040', '\061', - '\012', '\155', '\104', '\161', '\040', '\155', '\145', '\040', '\061', - '\012', '\152', '\170', '\120', '\040', '\151', '\152', '\040', '\061', - '\012', '\102', '\170', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\157', '\111', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\166', '\143', '\040', '\166', '\141', '\040', '\061', - '\012', '\165', '\103', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\101', '\157', '\040', '\166', '\157', '\040', '\061', - '\012', '\161', '\165', '\102', '\040', '\164', '\165', '\040', '\061', - '\012', '\142', '\164', '\126', '\040', '\164', '\151', '\040', '\061', - '\012', '\114', '\155', '\143', '\040', '\155', '\145', '\040', '\061', - '\012', '\164', '\126', '\167', '\040', '\164', '\151', '\040', '\061', - '\012', '\131', '\170', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\110', '\170', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\144', '\126', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\131', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\120', '\152', '\040', '\164', '\165', '\040', '\061', - '\012', '\146', '\124', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\122', '\152', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\144', '\101', '\040', '\144', '\151', '\040', '\061', - '\012', '\152', '\172', '\116', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\170', '\114', '\040', '\155', '\145', '\040', '\061', - '\012', '\171', '\147', '\112', '\040', '\156', '\147', '\040', '\061', - '\012', '\126', '\166', '\147', '\040', '\166', '\141', '\040', '\061', - '\012', '\162', '\152', '\113', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\165', '\126', '\040', '\164', '\165', '\040', '\061', - '\012', '\163', '\127', '\153', '\040', '\153', '\165', '\040', '\061', - '\012', '\120', '\147', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\110', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\172', '\153', '\125', '\040', '\153', '\165', '\040', '\061', - '\012', '\147', '\166', '\107', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\144', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\126', '\142', '\040', '\155', '\145', '\040', '\061', - '\012', '\121', '\147', '\144', '\040', '\144', '\151', '\040', '\061', - '\012', '\172', '\143', '\132', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\161', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\163', '\112', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\146', '\116', '\040', '\144', '\151', '\040', '\061', - '\012', '\144', '\147', '\127', '\040', '\144', '\151', '\040', '\061', - '\012', '\167', '\116', '\162', '\040', '\162', '\151', '\040', '\061', - '\012', '\172', '\166', '\103', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\131', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\110', '\171', '\040', '\164', '\165', '\040', '\061', - '\012', '\164', '\116', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\170', '\112', '\040', '\154', '\151', '\040', '\061', - '\012', '\110', '\142', '\153', '\040', '\153', '\165', '\040', '\061', - '\012', '\170', '\163', '\107', '\040', '\163', '\164', '\040', '\061', - '\012', '\166', '\123', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\106', '\142', '\040', '\142', '\165', '\040', '\061', - '\012', '\116', '\164', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\157', '\102', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\153', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\126', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\152', '\124', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\166', '\130', '\040', '\166', '\141', '\040', '\061', - '\012', '\157', '\132', '\146', '\040', '\164', '\157', '\040', '\061', - '\012', '\153', '\143', '\125', '\040', '\153', '\157', '\040', '\061', - '\012', '\146', '\106', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\130', '\142', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\113', '\161', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\122', '\167', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\144', '\166', '\112', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\156', '\112', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\161', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\170', '\115', '\040', '\160', '\157', '\040', '\061', - '\012', '\145', '\102', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\112', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\170', '\156', '\115', '\040', '\156', '\147', '\040', '\061', - '\012', '\141', '\103', '\161', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\110', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\164', '\146', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\161', '\156', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\123', '\163', '\040', '\151', '\163', '\040', '\061', - '\012', '\163', '\102', '\167', '\040', '\163', '\164', '\040', '\061', - '\012', '\106', '\150', '\156', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\116', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\115', '\166', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\142', '\126', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\110', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\114', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\147', '\106', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\170', '\127', '\040', '\166', '\141', '\040', '\061', - '\012', '\143', '\144', '\131', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\162', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\105', '\146', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\161', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\172', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\150', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\150', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\106', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\126', '\143', '\040', '\166', '\141', '\040', '\061', - '\012', '\154', '\115', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\124', '\161', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\101', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\151', '\115', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\116', '\154', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\142', '\120', '\040', '\163', '\172', '\040', '\061', - '\012', '\153', '\126', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\145', '\121', '\154', '\040', '\164', '\145', '\040', '\061', - '\012', '\163', '\127', '\142', '\040', '\163', '\164', '\040', '\061', - '\012', '\102', '\161', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\130', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\166', '\125', '\143', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\117', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\165', '\110', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\116', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\106', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\115', '\154', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\153', '\155', '\132', '\040', '\153', '\141', '\040', '\061', - '\012', '\163', '\122', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\161', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\146', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\170', '\121', '\040', '\166', '\141', '\040', '\061', - '\012', '\154', '\103', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\131', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\164', '\146', '\123', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\144', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\121', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\144', '\130', '\040', '\144', '\145', '\040', '\061', - '\012', '\155', '\116', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\153', '\106', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\152', '\123', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\120', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\167', '\143', '\127', '\040', '\143', '\150', '\040', '\061', - '\012', '\116', '\152', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\126', '\160', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\161', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\112', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\160', '\110', '\040', '\160', '\157', '\040', '\061', - '\012', '\170', '\161', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\126', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\102', '\164', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\155', '\102', '\040', '\156', '\164', '\040', '\061', - '\012', '\172', '\143', '\115', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\146', '\107', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\146', '\117', '\040', '\155', '\145', '\040', '\061', - '\012', '\131', '\150', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\132', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\155', '\172', '\102', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\122', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\171', '\104', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\147', '\146', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\161', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\111', '\165', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\142', '\127', '\040', '\145', '\162', '\040', '\061', - '\012', '\112', '\155', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\113', '\166', '\152', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\143', '\104', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\147', '\103', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\103', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\127', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\167', '\127', '\040', '\167', '\141', '\040', '\061', - '\012', '\112', '\153', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\107', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\142', '\110', '\040', '\166', '\141', '\040', '\061', - '\012', '\154', '\124', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\145', '\103', '\142', '\040', '\145', '\162', '\040', '\061', - '\012', '\152', '\126', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\104', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\157', '\121', '\040', '\160', '\157', '\040', '\061', - '\012', '\161', '\164', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\122', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\110', '\166', '\147', '\040', '\166', '\141', '\040', '\061', - '\012', '\165', '\101', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\146', '\127', '\040', '\155', '\145', '\040', '\061', - '\012', '\164', '\147', '\123', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\161', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\146', '\131', '\040', '\163', '\172', '\040', '\061', - '\012', '\131', '\150', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\161', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\160', '\113', '\040', '\160', '\162', '\040', '\061', - '\012', '\112', '\172', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\121', '\153', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\152', '\117', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\170', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\120', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\116', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\166', '\121', '\040', '\166', '\141', '\040', '\061', - '\012', '\153', '\107', '\167', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\165', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\166', '\171', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\131', '\145', '\040', '\164', '\145', '\040', '\061', - '\012', '\146', '\132', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\131', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\150', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\170', '\131', '\040', '\146', '\157', '\040', '\061', - '\012', '\171', '\120', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\146', '\107', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\144', '\155', '\124', '\040', '\155', '\145', '\040', '\061', - '\012', '\166', '\146', '\130', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\121', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\170', '\123', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\172', '\101', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\141', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\142', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\153', '\126', '\144', '\040', '\153', '\141', '\040', '\061', - '\012', '\130', '\152', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\153', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\121', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\150', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\104', '\166', '\152', '\040', '\166', '\141', '\040', '\061', - '\012', '\126', '\142', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\146', '\160', '\116', '\040', '\160', '\162', '\040', '\061', - '\012', '\160', '\153', '\107', '\040', '\153', '\141', '\040', '\061', - '\012', '\142', '\114', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\112', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\167', '\112', '\040', '\167', '\141', '\040', '\061', - '\012', '\132', '\162', '\167', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\144', '\127', '\040', '\144', '\145', '\040', '\061', - '\012', '\127', '\147', '\146', '\040', '\156', '\147', '\040', '\061', - '\012', '\120', '\161', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\147', '\116', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\110', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\124', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\104', '\166', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\155', '\125', '\040', '\155', '\145', '\040', '\061', - '\012', '\170', '\150', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\103', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\167', '\126', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\166', '\114', '\040', '\166', '\141', '\040', '\061', - '\012', '\156', '\107', '\146', '\040', '\156', '\164', '\040', '\061', - '\012', '\152', '\152', '\103', '\040', '\151', '\152', '\040', '\061', - '\012', '\125', '\143', '\147', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\127', '\146', '\040', '\160', '\162', '\040', '\061', - '\012', '\152', '\170', '\107', '\040', '\151', '\152', '\040', '\061', - '\012', '\115', '\161', '\156', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\166', '\127', '\040', '\166', '\141', '\040', '\061', - '\012', '\154', '\127', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\155', '\144', '\117', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\116', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\167', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\146', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\165', '\117', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\150', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\114', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\102', '\171', '\040', '\146', '\157', '\040', '\061', - '\012', '\156', '\125', '\152', '\040', '\156', '\164', '\040', '\061', - '\012', '\154', '\124', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\154', '\120', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\162', '\122', '\040', '\145', '\162', '\040', '\061', - '\012', '\162', '\130', '\167', '\040', '\145', '\162', '\040', '\061', - '\012', '\145', '\126', '\167', '\040', '\166', '\145', '\040', '\061', - '\012', '\172', '\127', '\156', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\112', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\115', '\147', '\171', '\040', '\156', '\147', '\040', '\061', - '\012', '\165', '\132', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\124', '\144', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\161', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\104', '\150', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\155', '\113', '\040', '\155', '\145', '\040', '\061', - '\012', '\123', '\163', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\163', '\127', '\154', '\040', '\163', '\172', '\040', '\061', - '\012', '\151', '\161', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\152', '\107', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\152', '\102', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\113', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\166', '\111', '\040', '\166', '\141', '\040', '\061', - '\012', '\164', '\143', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\153', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\125', '\145', '\040', '\164', '\145', '\040', '\061', - '\012', '\154', '\125', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\102', '\147', '\040', '\156', '\164', '\040', '\061', - '\012', '\144', '\110', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\127', '\142', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\165', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\110', '\160', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\157', '\126', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\102', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\124', '\144', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\146', '\126', '\040', '\160', '\162', '\040', '\061', - '\012', '\161', '\147', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\143', '\125', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\143', '\116', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\153', '\101', '\040', '\166', '\141', '\040', '\061', - '\012', '\143', '\121', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\131', '\172', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\160', '\106', '\040', '\160', '\162', '\040', '\061', - '\012', '\166', '\102', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\120', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\155', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\145', '\127', '\146', '\040', '\166', '\145', '\040', '\061', - '\012', '\152', '\132', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\110', '\167', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\171', '\171', '\111', '\040', '\156', '\171', '\040', '\061', - '\012', '\132', '\146', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\114', '\147', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\165', '\161', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\117', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\144', '\153', '\112', '\040', '\153', '\157', '\040', '\061', - '\012', '\144', '\161', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\142', '\127', '\040', '\151', '\163', '\040', '\061', - '\012', '\172', '\115', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\156', '\112', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\115', '\143', '\040', '\153', '\157', '\040', '\061', - '\012', '\172', '\161', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\121', '\153', '\040', '\166', '\141', '\040', '\061', - '\012', '\145', '\161', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\106', '\156', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\143', '\132', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\107', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\153', '\172', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\132', '\170', '\040', '\170', '\145', '\040', '\061', - '\012', '\161', '\166', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\153', '\131', '\040', '\153', '\141', '\040', '\061', - '\012', '\142', '\162', '\110', '\040', '\145', '\162', '\040', '\061', - '\012', '\127', '\162', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\152', '\105', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\152', '\121', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\114', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\147', '\105', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\167', '\111', '\040', '\167', '\141', '\040', '\061', - '\012', '\151', '\104', '\167', '\040', '\164', '\151', '\040', '\061', - '\012', '\102', '\164', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\120', '\172', '\040', '\166', '\141', '\040', '\061', - '\012', '\171', '\161', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\106', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\154', '\121', '\171', '\040', '\154', '\145', '\040', '\061', - '\012', '\147', '\102', '\160', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\144', '\131', '\040', '\144', '\145', '\040', '\061', - '\012', '\164', '\166', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\152', '\117', '\040', '\154', '\145', '\040', '\061', - '\012', '\116', '\163', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\144', '\117', '\040', '\144', '\145', '\040', '\061', - '\012', '\147', '\172', '\127', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\164', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\146', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\132', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\143', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\166', '\121', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\110', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\142', '\115', '\040', '\142', '\145', '\040', '\061', - '\012', '\156', '\127', '\147', '\040', '\156', '\164', '\040', '\061', - '\012', '\131', '\167', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\130', '\167', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\170', '\113', '\040', '\160', '\162', '\040', '\061', - '\012', '\171', '\142', '\121', '\040', '\142', '\145', '\040', '\061', - '\012', '\127', '\166', '\155', '\040', '\166', '\141', '\040', '\061', - '\012', '\114', '\147', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\164', '\123', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\122', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\161', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\103', '\156', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\106', '\155', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\144', '\166', '\120', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\161', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\152', '\111', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\126', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\166', '\132', '\040', '\166', '\141', '\040', '\061', - '\012', '\103', '\167', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\125', '\171', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\106', '\146', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\157', '\130', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\150', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\127', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\162', '\130', '\040', '\166', '\141', '\040', '\061', - '\012', '\145', '\117', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\167', '\132', '\040', '\142', '\145', '\040', '\061', - '\012', '\144', '\156', '\126', '\040', '\156', '\147', '\040', '\061', - '\012', '\107', '\142', '\167', '\040', '\142', '\145', '\040', '\061', - '\012', '\170', '\107', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\155', '\156', '\132', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\160', '\116', '\040', '\160', '\162', '\040', '\061', - '\012', '\144', '\172', '\130', '\040', '\144', '\145', '\040', '\061', - '\012', '\102', '\170', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\160', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\161', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\124', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\167', '\120', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\143', '\170', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\144', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\167', '\130', '\040', '\167', '\141', '\040', '\061', - '\012', '\125', '\166', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\162', '\113', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\163', '\144', '\106', '\040', '\144', '\145', '\040', '\061', - '\012', '\112', '\143', '\147', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\172', '\117', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\124', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\152', '\120', '\040', '\144', '\145', '\040', '\061', - '\012', '\147', '\124', '\156', '\040', '\156', '\147', '\040', '\061', - '\012', '\107', '\164', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\147', '\101', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\144', '\114', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\172', '\117', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\150', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\155', '\160', '\040', '\155', '\145', '\040', '\061', - '\012', '\121', '\144', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\131', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\142', '\112', '\040', '\160', '\162', '\040', '\061', - '\012', '\152', '\122', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\130', '\163', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\147', '\111', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\150', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\107', '\147', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\106', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\167', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\170', '\127', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\103', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\143', '\114', '\040', '\143', '\150', '\040', '\061', - '\012', '\113', '\170', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\155', '\131', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\162', '\121', '\164', '\040', '\145', '\162', '\040', '\061', - '\012', '\132', '\170', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\144', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\167', '\110', '\040', '\144', '\145', '\040', '\061', - '\012', '\131', '\155', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\126', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\166', '\154', '\040', '\166', '\141', '\040', '\061', - '\012', '\171', '\110', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\127', '\152', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\115', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\172', '\125', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\143', '\114', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\117', '\141', '\040', '\161', '\165', '\040', '\061', - '\012', '\145', '\161', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\151', '\131', '\160', '\040', '\164', '\151', '\040', '\061', - '\012', '\166', '\103', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\157', '\126', '\040', '\162', '\157', '\040', '\061', - '\012', '\146', '\132', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\161', '\121', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\144', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\127', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\153', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\106', '\160', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\107', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\162', '\167', '\117', '\040', '\145', '\162', '\040', '\061', - '\012', '\121', '\172', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\113', '\161', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\147', '\124', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\163', '\132', '\040', '\163', '\172', '\040', '\061', - '\012', '\141', '\110', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\152', '\114', '\040', '\151', '\152', '\040', '\061', - '\012', '\131', '\143', '\167', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\156', '\120', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\127', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\171', '\131', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\122', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\167', '\165', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\152', '\102', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\162', '\124', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\167', '\112', '\040', '\166', '\141', '\040', '\061', - '\012', '\144', '\126', '\152', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\166', '\127', '\040', '\166', '\141', '\040', '\061', - '\012', '\144', '\132', '\153', '\040', '\144', '\145', '\040', '\061', - '\012', '\156', '\162', '\107', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\163', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\120', '\166', '\163', '\040', '\166', '\141', '\040', '\061', - '\012', '\154', '\114', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\103', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\166', '\126', '\040', '\144', '\145', '\040', '\061', - '\012', '\120', '\152', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\113', '\155', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\112', '\146', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\167', '\131', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\167', '\103', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\107', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\127', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\160', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\113', '\153', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\127', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\152', '\155', '\116', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\160', '\126', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\172', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\132', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\155', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\116', '\153', '\040', '\155', '\145', '\040', '\061', - '\012', '\171', '\160', '\115', '\040', '\160', '\162', '\040', '\061', - '\012', '\154', '\167', '\110', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\110', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\172', '\103', '\040', '\152', '\157', '\040', '\061', - '\012', '\157', '\112', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\114', '\161', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\130', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\105', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\165', '\127', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\166', '\124', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\163', '\107', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\123', '\170', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\113', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\171', '\145', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\110', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\103', '\167', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\172', '\155', '\112', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\165', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\144', '\110', '\040', '\144', '\145', '\040', '\061', - '\012', '\120', '\142', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\144', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\126', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\161', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\116', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\172', '\116', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\152', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\150', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\160', '\112', '\040', '\160', '\162', '\040', '\061', - '\012', '\170', '\115', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\124', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\164', '\114', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\147', '\122', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\121', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\122', '\152', '\160', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\150', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\103', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\142', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\170', '\121', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\126', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\153', '\131', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\120', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\121', '\153', '\040', '\151', '\152', '\040', '\061', - '\012', '\117', '\166', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\126', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\155', '\125', '\040', '\155', '\145', '\040', '\061', - '\012', '\165', '\106', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\141', '\132', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\107', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\147', '\111', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\124', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\166', '\103', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\107', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\162', '\116', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\121', '\164', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\116', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\120', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\112', '\144', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\144', '\152', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\151', '\167', '\131', '\040', '\164', '\151', '\040', '\061', - '\012', '\116', '\155', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\124', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\161', '\172', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\152', '\101', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\166', '\110', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\114', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\127', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\126', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\121', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\166', '\131', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\114', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\161', '\172', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\104', '\170', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\165', '\172', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\126', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\132', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\107', '\160', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\170', '\161', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\143', '\130', '\040', '\143', '\150', '\040', '\061', - '\012', '\110', '\170', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\164', '\125', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\113', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\151', '\107', '\170', '\040', '\164', '\151', '\040', '\061', - '\012', '\170', '\166', '\121', '\040', '\166', '\141', '\040', '\061', - '\012', '\154', '\170', '\101', '\040', '\154', '\145', '\040', '\061', - '\012', '\163', '\152', '\110', '\040', '\163', '\164', '\040', '\061', - '\012', '\107', '\161', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\147', '\121', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\104', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\132', '\156', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\146', '\125', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\165', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\121', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\150', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\114', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\144', '\131', '\040', '\144', '\145', '\040', '\061', - '\012', '\162', '\132', '\142', '\040', '\145', '\162', '\040', '\061', - '\012', '\153', '\104', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\163', '\113', '\040', '\163', '\172', '\040', '\061', - '\012', '\113', '\161', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\127', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\155', '\126', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\155', '\143', '\126', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\104', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\101', '\157', '\040', '\154', '\145', '\040', '\061', - '\012', '\146', '\172', '\122', '\040', '\163', '\172', '\040', '\061', - '\012', '\130', '\162', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\162', '\132', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\155', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\156', '\160', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\150', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\161', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\127', '\156', '\040', '\144', '\145', '\040', '\061', - '\012', '\127', '\155', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\122', '\147', '\171', '\040', '\156', '\147', '\040', '\061', - '\012', '\165', '\166', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\151', '\131', '\040', '\164', '\151', '\040', '\061', - '\012', '\170', '\127', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\112', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\157', '\110', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\166', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\131', '\144', '\156', '\040', '\144', '\145', '\040', '\061', - '\012', '\116', '\166', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\155', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\170', '\132', '\040', '\170', '\145', '\040', '\061', - '\012', '\130', '\144', '\146', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\131', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\156', '\166', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\116', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\127', '\156', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\167', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\127', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\121', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\126', '\170', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\170', '\167', '\107', '\040', '\167', '\141', '\040', '\061', - '\012', '\167', '\166', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\155', '\126', '\040', '\156', '\147', '\040', '\061', - '\012', '\122', '\172', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\103', '\160', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\107', '\171', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\170', '\172', '\101', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\107', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\142', '\161', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\150', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\120', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\151', '\161', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\152', '\113', '\040', '\144', '\145', '\040', '\061', - '\012', '\143', '\126', '\153', '\040', '\143', '\150', '\040', '\061', - '\012', '\162', '\167', '\124', '\040', '\145', '\162', '\040', '\061', - '\012', '\126', '\150', '\156', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\146', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\142', '\156', '\112', '\040', '\141', '\156', '\040', '\061', - '\012', '\103', '\160', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\116', '\155', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\156', '\117', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\127', '\143', '\040', '\161', '\165', '\040', '\061', - '\012', '\141', '\126', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\117', '\156', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\154', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\156', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\114', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\164', '\105', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\147', '\122', '\040', '\156', '\147', '\040', '\061', - '\012', '\131', '\161', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\110', '\167', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\156', '\127', '\153', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\161', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\101', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\150', '\132', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\113', '\172', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\116', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\124', '\153', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\165', '\131', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\143', '\122', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\116', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\153', '\110', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\142', '\112', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\152', '\152', '\104', '\040', '\151', '\152', '\040', '\061', - '\012', '\116', '\154', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\150', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\130', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\156', '\167', '\102', '\040', '\141', '\156', '\040', '\061', - '\012', '\110', '\172', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\121', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\113', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\126', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\154', '\125', '\040', '\154', '\145', '\040', '\061', - '\012', '\114', '\172', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\163', '\130', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\102', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\111', '\161', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\152', '\126', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\170', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\172', '\113', '\040', '\163', '\172', '\040', '\061', - '\012', '\162', '\104', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\165', '\121', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\107', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\142', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\125', '\157', '\040', '\153', '\141', '\040', '\061', - '\012', '\144', '\126', '\155', '\040', '\144', '\145', '\040', '\061', - '\012', '\104', '\144', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\161', '\103', '\040', '\166', '\157', '\040', '\061', - '\012', '\152', '\153', '\132', '\040', '\151', '\152', '\040', '\061', - '\012', '\114', '\166', '\172', '\040', '\166', '\141', '\040', '\061', - '\012', '\164', '\120', '\171', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\146', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\121', '\150', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\150', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\161', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\103', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\152', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\121', '\146', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\172', '\167', '\106', '\040', '\163', '\172', '\040', '\061', - '\012', '\106', '\167', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\160', '\166', '\125', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\150', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\124', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\154', '\121', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\172', '\114', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\161', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\164', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\150', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\152', '\102', '\040', '\151', '\152', '\040', '\061', - '\012', '\151', '\124', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\153', '\114', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\122', '\161', '\151', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\152', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\152', '\111', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\107', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\156', '\126', '\040', '\141', '\156', '\040', '\061', - '\012', '\154', '\121', '\170', '\040', '\154', '\145', '\040', '\061', - '\012', '\165', '\166', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\147', '\145', '\040', '\144', '\145', '\040', '\061', - '\012', '\147', '\112', '\166', '\040', '\156', '\147', '\040', '\061', - '\012', '\131', '\144', '\142', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\104', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\167', '\126', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\116', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\167', '\121', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\122', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\126', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\156', '\113', '\147', '\040', '\141', '\156', '\040', '\061', - '\012', '\124', '\147', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\131', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\154', '\102', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\152', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\101', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\155', '\113', '\040', '\155', '\145', '\040', '\061', - '\012', '\167', '\161', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\152', '\124', '\040', '\166', '\141', '\040', '\061', - '\012', '\114', '\161', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\156', '\103', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\172', '\131', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\161', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\107', '\142', '\040', '\155', '\145', '\040', '\061', - '\012', '\146', '\153', '\120', '\040', '\153', '\141', '\040', '\061', - '\012', '\167', '\121', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\106', '\161', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\126', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\127', '\143', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\160', '\131', '\040', '\167', '\141', '\040', '\061', - '\012', '\154', '\106', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\167', '\104', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\127', '\160', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\152', '\124', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\106', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\111', '\160', '\040', '\151', '\156', '\040', '\061', - '\012', '\164', '\142', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\161', '\143', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\153', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\145', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\120', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\167', '\114', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\110', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\170', '\167', '\120', '\040', '\167', '\141', '\040', '\061', - '\012', '\170', '\166', '\102', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\123', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\172', '\106', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\131', '\160', '\040', '\167', '\141', '\040', '\061', - '\012', '\144', '\104', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\156', '\102', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\116', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\125', '\142', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\170', '\130', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\122', '\154', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\102', '\172', '\040', '\144', '\145', '\040', '\061', - '\012', '\130', '\166', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\154', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\155', '\167', '\131', '\040', '\155', '\145', '\040', '\061', - '\012', '\167', '\150', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\115', '\172', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\101', '\161', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\104', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\152', '\132', '\040', '\143', '\150', '\040', '\061', - '\012', '\126', '\153', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\165', '\107', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\102', '\163', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\114', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\146', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\120', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\157', '\116', '\040', '\157', '\156', '\040', '\061', - '\012', '\131', '\144', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\114', '\170', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\143', '\143', '\132', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\112', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\126', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\162', '\105', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\147', '\120', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\120', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\145', '\165', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\132', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\156', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\102', '\147', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\154', '\121', '\040', '\154', '\145', '\040', '\061', - '\012', '\147', '\170', '\101', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\114', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\156', '\104', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\130', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\164', '\146', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\167', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\127', '\144', '\040', '\144', '\157', '\040', '\061', - '\012', '\170', '\156', '\110', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\117', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\114', '\153', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\116', '\166', '\171', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\111', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\153', '\113', '\040', '\153', '\141', '\040', '\061', - '\012', '\162', '\115', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\162', '\155', '\121', '\040', '\145', '\162', '\040', '\061', - '\012', '\142', '\120', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\101', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\121', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\110', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\120', '\155', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\172', '\112', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\124', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\127', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\132', '\167', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\113', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\107', '\142', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\115', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\116', '\146', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\146', '\101', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\144', '\110', '\142', '\040', '\144', '\145', '\040', '\061', - '\012', '\154', '\170', '\110', '\040', '\154', '\145', '\040', '\061', - '\012', '\144', '\161', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\124', '\154', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\152', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\111', '\171', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\157', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\150', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\115', '\152', '\040', '\154', '\145', '\040', '\061', - '\012', '\146', '\172', '\106', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\162', '\122', '\040', '\145', '\162', '\040', '\061', - '\012', '\171', '\116', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\141', '\120', '\166', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\167', '\107', '\040', '\167', '\141', '\040', '\061', - '\012', '\103', '\155', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\163', '\166', '\113', '\040', '\166', '\141', '\040', '\061', - '\012', '\163', '\162', '\117', '\040', '\145', '\162', '\040', '\061', - '\012', '\125', '\150', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\120', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\124', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\172', '\110', '\040', '\163', '\172', '\040', '\061', - '\012', '\111', '\157', '\170', '\040', '\157', '\156', '\040', '\061', - '\012', '\146', '\121', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\132', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\156', '\161', '\125', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\120', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\124', '\172', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\156', '\122', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\146', '\112', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\171', '\130', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\114', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\152', '\120', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\155', '\122', '\040', '\155', '\145', '\040', '\061', - '\012', '\145', '\120', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\171', '\124', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\152', '\120', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\163', '\110', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\167', '\102', '\040', '\166', '\141', '\040', '\061', - '\012', '\131', '\156', '\162', '\040', '\141', '\156', '\040', '\061', - '\012', '\124', '\161', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\114', '\166', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\164', '\103', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\160', '\102', '\040', '\167', '\141', '\040', '\061', - '\012', '\167', '\130', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\150', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\131', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\104', '\160', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\147', '\122', '\040', '\156', '\147', '\040', '\061', - '\012', '\122', '\146', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\112', '\171', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\170', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\120', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\141', '\117', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\132', '\167', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\146', '\106', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\142', '\104', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\113', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\110', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\150', '\162', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\106', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\114', '\170', '\040', '\154', '\145', '\040', '\061', - '\012', '\141', '\131', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\103', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\127', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\144', '\131', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\167', '\111', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\114', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\115', '\172', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\113', '\153', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\115', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\143', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\152', '\102', '\040', '\151', '\152', '\040', '\061', - '\012', '\115', '\161', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\170', '\127', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\132', '\166', '\040', '\156', '\147', '\040', '\061', - '\012', '\122', '\146', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\167', '\104', '\040', '\167', '\141', '\040', '\061', - '\012', '\154', '\150', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\126', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\146', '\127', '\040', '\166', '\141', '\040', '\061', - '\012', '\154', '\170', '\120', '\040', '\154', '\145', '\040', '\061', - '\012', '\131', '\171', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\150', '\120', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\125', '\170', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\144', '\117', '\040', '\144', '\145', '\040', '\061', - '\012', '\142', '\122', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\130', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\147', '\126', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\101', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\167', '\130', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\113', '\166', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\163', '\166', '\114', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\127', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\144', '\162', '\121', '\040', '\145', '\162', '\040', '\061', - '\012', '\114', '\160', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\113', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\145', '\103', '\166', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\167', '\110', '\040', '\167', '\141', '\040', '\061', - '\012', '\143', '\166', '\103', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\125', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\157', '\120', '\170', '\040', '\157', '\156', '\040', '\061', - '\012', '\164', '\152', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\102', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\166', '\160', '\111', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\172', '\131', '\040', '\156', '\147', '\040', '\061', - '\012', '\157', '\132', '\163', '\040', '\157', '\156', '\040', '\061', - '\012', '\160', '\113', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\113', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\143', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\146', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\163', '\166', '\115', '\040', '\166', '\141', '\040', '\061', - '\012', '\126', '\152', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\154', '\126', '\167', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\127', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\130', '\160', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\154', '\143', '\101', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\114', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\104', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\130', '\152', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\144', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\113', '\155', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\156', '\127', '\040', '\141', '\156', '\040', '\061', - '\012', '\124', '\143', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\147', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\132', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\145', '\112', '\166', '\040', '\145', '\162', '\040', '\061', - '\012', '\131', '\170', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\153', '\146', '\115', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\113', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\115', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\144', '\147', '\131', '\040', '\144', '\145', '\040', '\061', - '\012', '\147', '\107', '\144', '\040', '\156', '\147', '\040', '\061', - '\012', '\126', '\143', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\123', '\146', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\170', '\104', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\124', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\122', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\117', '\141', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\165', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\147', '\112', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\122', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\153', '\131', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\167', '\104', '\040', '\167', '\141', '\040', '\061', - '\012', '\166', '\130', '\163', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\154', '\103', '\040', '\154', '\145', '\040', '\061', - '\012', '\153', '\155', '\110', '\040', '\153', '\141', '\040', '\061', - '\012', '\152', '\150', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\170', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\166', '\164', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\127', '\155', '\040', '\151', '\156', '\040', '\061', - '\012', '\161', '\126', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\110', '\152', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\120', '\170', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\131', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\167', '\147', '\107', '\040', '\156', '\147', '\040', '\061', - '\012', '\112', '\166', '\163', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\110', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\113', '\172', '\171', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\152', '\111', '\040', '\151', '\152', '\040', '\061', - '\012', '\165', '\126', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\120', '\172', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\170', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\120', '\171', '\040', '\167', '\141', '\040', '\061', - '\012', '\142', '\130', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\172', '\131', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\161', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\170', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\146', '\102', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\120', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\142', '\160', '\103', '\040', '\160', '\162', '\040', '\061', - '\012', '\150', '\106', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\103', '\161', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\167', '\111', '\040', '\144', '\145', '\040', '\061', - '\012', '\124', '\143', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\132', '\152', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\117', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\112', '\146', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\151', '\132', '\162', '\040', '\151', '\156', '\040', '\061', - '\012', '\126', '\170', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\114', '\160', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\146', '\110', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\106', '\171', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\143', '\104', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\115', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\171', '\125', '\040', '\156', '\171', '\040', '\061', - '\012', '\155', '\107', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\112', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\113', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\115', '\155', '\040', '\154', '\145', '\040', '\061', - '\012', '\155', '\161', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\110', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\154', '\107', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\145', '\111', '\152', '\040', '\164', '\145', '\040', '\061', - '\012', '\126', '\144', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\103', '\153', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\121', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\131', '\167', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\172', '\125', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\132', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\116', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\104', '\170', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\131', '\162', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\113', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\104', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\156', '\106', '\040', '\141', '\156', '\040', '\061', - '\012', '\114', '\163', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\110', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\103', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\156', '\130', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\102', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\152', '\126', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\117', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\161', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\146', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\143', '\152', '\123', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\146', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\166', '\111', '\040', '\166', '\141', '\040', '\061', - '\012', '\117', '\167', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\147', '\130', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\157', '\103', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\115', '\162', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\111', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\112', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\161', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\161', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\120', '\172', '\040', '\145', '\162', '\040', '\061', - '\012', '\151', '\167', '\127', '\040', '\151', '\156', '\040', '\061', - '\012', '\143', '\115', '\160', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\126', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\124', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\111', '\167', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\170', '\154', '\132', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\152', '\121', '\040', '\166', '\141', '\040', '\061', - '\012', '\151', '\120', '\142', '\040', '\151', '\156', '\040', '\061', - '\012', '\127', '\150', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\166', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\172', '\104', '\040', '\163', '\172', '\040', '\061', - '\012', '\110', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\161', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\150', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\162', '\122', '\040', '\145', '\162', '\040', '\061', - '\012', '\156', '\154', '\126', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\131', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\126', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\160', '\117', '\040', '\166', '\141', '\040', '\061', - '\012', '\122', '\166', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\163', '\143', '\131', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\144', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\114', '\153', '\040', '\166', '\141', '\040', '\061', - '\012', '\163', '\166', '\111', '\040', '\166', '\141', '\040', '\061', - '\012', '\155', '\144', '\105', '\040', '\144', '\145', '\040', '\061', - '\012', '\150', '\102', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\162', '\166', '\040', '\145', '\162', '\040', '\061', - '\012', '\152', '\127', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\124', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\131', '\160', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\115', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\144', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\143', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\103', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\146', '\126', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\141', '\120', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\160', '\125', '\040', '\160', '\162', '\040', '\061', - '\012', '\126', '\153', '\142', '\040', '\153', '\141', '\040', '\061', - '\012', '\164', '\142', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\121', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\170', '\126', '\040', '\156', '\147', '\040', '\061', - '\012', '\123', '\146', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\131', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\147', '\127', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\105', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\155', '\130', '\171', '\040', '\155', '\145', '\040', '\061', - '\012', '\154', '\156', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\155', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\153', '\171', '\040', '\153', '\141', '\040', '\061', - '\012', '\167', '\167', '\130', '\040', '\167', '\141', '\040', '\061', - '\012', '\125', '\167', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\143', '\146', '\102', '\040', '\143', '\150', '\040', '\061', - '\012', '\107', '\170', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\146', '\160', '\114', '\040', '\160', '\162', '\040', '\061', - '\012', '\152', '\124', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\132', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\154', '\113', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\102', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\161', '\151', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\107', '\163', '\040', '\154', '\145', '\040', '\061', - '\012', '\104', '\161', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\147', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\103', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\116', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\161', '\112', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\154', '\104', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\130', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\130', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\153', '\150', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\132', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\123', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\152', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\110', '\167', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\146', '\130', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\147', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\144', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\150', '\143', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\112', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\143', '\155', '\121', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\166', '\126', '\040', '\166', '\141', '\040', '\061', - '\012', '\116', '\161', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\170', '\123', '\040', '\163', '\172', '\040', '\061', - '\012', '\153', '\107', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\106', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\172', '\115', '\040', '\163', '\172', '\040', '\061', - '\012', '\130', '\162', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\144', '\143', '\112', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\121', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\116', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\170', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\167', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\102', '\161', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\162', '\113', '\040', '\145', '\162', '\040', '\061', - '\012', '\172', '\144', '\103', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\101', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\144', '\114', '\164', '\040', '\163', '\164', '\040', '\061', - '\012', '\160', '\147', '\106', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\147', '\127', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\160', '\116', '\040', '\166', '\141', '\040', '\061', - '\012', '\111', '\166', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\131', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\122', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\120', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\117', '\161', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\152', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\160', '\110', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\104', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\170', '\146', '\112', '\040', '\146', '\157', '\040', '\061', - '\012', '\146', '\161', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\145', '\102', '\146', '\040', '\145', '\162', '\040', '\061', - '\012', '\132', '\153', '\167', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\110', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\101', '\161', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\116', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\146', '\152', '\130', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\161', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\152', '\113', '\040', '\154', '\145', '\040', '\061', - '\012', '\107', '\153', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\142', '\123', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\115', '\170', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\104', '\161', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\113', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\106', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\155', '\112', '\040', '\155', '\145', '\040', '\061', - '\012', '\166', '\172', '\124', '\040', '\166', '\141', '\040', '\061', - '\012', '\162', '\150', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\110', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\112', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\161', '\127', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\166', '\153', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\153', '\102', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\105', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\125', '\147', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\121', '\155', '\171', '\040', '\155', '\145', '\040', '\061', - '\012', '\114', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\107', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\154', '\110', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\107', '\147', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\106', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\156', '\126', '\040', '\141', '\156', '\040', '\061', - '\012', '\145', '\106', '\171', '\040', '\145', '\162', '\040', '\061', - '\012', '\116', '\146', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\150', '\123', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\130', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\110', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\165', '\161', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\130', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\143', '\124', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\112', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\127', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\161', '\160', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\161', '\105', '\040', '\164', '\150', '\040', '\061', - '\012', '\131', '\146', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\162', '\111', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\147', '\113', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\171', '\120', '\040', '\156', '\171', '\040', '\061', - '\012', '\132', '\155', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\114', '\153', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\145', '\125', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\162', '\131', '\040', '\145', '\162', '\040', '\061', - '\012', '\153', '\106', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\163', '\125', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\154', '\132', '\040', '\154', '\145', '\040', '\061', - '\012', '\143', '\156', '\126', '\040', '\143', '\150', '\040', '\061', - '\012', '\141', '\120', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\152', '\105', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\132', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\165', '\106', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\113', '\156', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\106', '\160', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\146', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\156', '\103', '\040', '\141', '\156', '\040', '\061', - '\012', '\104', '\154', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\162', '\115', '\040', '\145', '\162', '\040', '\061', - '\012', '\163', '\146', '\102', '\040', '\163', '\172', '\040', '\061', - '\012', '\107', '\170', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\106', '\153', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\107', '\153', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\122', '\155', '\040', '\156', '\147', '\040', '\061', - '\012', '\162', '\127', '\146', '\040', '\145', '\162', '\040', '\061', - '\012', '\162', '\131', '\166', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\105', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\110', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\123', '\155', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\154', '\106', '\160', '\040', '\154', '\145', '\040', '\061', - '\012', '\153', '\104', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\123', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\162', '\114', '\167', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\156', '\132', '\040', '\141', '\156', '\040', '\061', - '\012', '\127', '\152', '\160', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\124', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\113', '\143', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\113', '\163', '\040', '\166', '\141', '\040', '\061', - '\012', '\142', '\143', '\113', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\167', '\171', '\040', '\166', '\141', '\040', '\061', - '\012', '\125', '\152', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\121', '\166', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\144', '\143', '\126', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\126', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\165', '\111', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\154', '\116', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\167', '\114', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\127', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\120', '\170', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\162', '\122', '\142', '\040', '\145', '\162', '\040', '\061', - '\012', '\142', '\146', '\104', '\040', '\142', '\145', '\040', '\061', - '\012', '\171', '\103', '\170', '\040', '\156', '\171', '\040', '\061', - '\012', '\156', '\112', '\163', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\103', '\155', '\040', '\144', '\145', '\040', '\061', - '\012', '\143', '\142', '\107', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\103', '\146', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\155', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\145', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\156', '\123', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\167', '\131', '\040', '\156', '\147', '\040', '\061', - '\012', '\127', '\152', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\155', '\111', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\152', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\167', '\166', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\112', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\143', '\156', '\101', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\102', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\147', '\106', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\104', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\147', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\125', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\104', '\156', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\110', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\167', '\130', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\171', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\153', '\104', '\040', '\153', '\141', '\040', '\061', - '\012', '\163', '\114', '\172', '\040', '\163', '\164', '\040', '\061', - '\012', '\172', '\170', '\106', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\115', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\154', '\122', '\040', '\154', '\145', '\040', '\061', - '\012', '\160', '\167', '\132', '\040', '\160', '\162', '\040', '\061', - '\012', '\160', '\131', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\146', '\114', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\164', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\124', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\144', '\103', '\160', '\040', '\144', '\145', '\040', '\061', - '\012', '\142', '\167', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\170', '\103', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\146', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\114', '\156', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\131', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\160', '\127', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\111', '\170', '\040', '\157', '\156', '\040', '\061', - '\012', '\171', '\167', '\105', '\040', '\167', '\141', '\040', '\061', - '\012', '\167', '\116', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\152', '\167', '\117', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\132', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\107', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\143', '\126', '\167', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\152', '\113', '\040', '\151', '\152', '\040', '\061', - '\012', '\107', '\172', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\167', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\102', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\124', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\162', '\110', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\163', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\105', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\162', '\113', '\040', '\145', '\162', '\040', '\061', - '\012', '\155', '\115', '\142', '\040', '\155', '\145', '\040', '\061', - '\012', '\160', '\110', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\143', '\152', '\116', '\040', '\143', '\150', '\040', '\061', - '\012', '\156', '\130', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\167', '\117', '\040', '\167', '\141', '\040', '\061', - '\012', '\146', '\154', '\102', '\040', '\154', '\145', '\040', '\061', - '\012', '\121', '\161', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\113', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\106', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\146', '\107', '\040', '\167', '\141', '\040', '\061', - '\012', '\167', '\146', '\102', '\040', '\167', '\141', '\040', '\061', - '\012', '\112', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\167', '\113', '\040', '\167', '\141', '\040', '\061', - '\012', '\150', '\150', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\125', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\106', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\153', '\124', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\114', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\150', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\155', '\126', '\040', '\155', '\145', '\040', '\061', - '\012', '\164', '\155', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\122', '\164', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\171', '\131', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\171', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\122', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\130', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\132', '\156', '\172', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\161', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\115', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\167', '\126', '\040', '\156', '\147', '\040', '\061', - '\012', '\120', '\142', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\143', '\115', '\040', '\143', '\150', '\040', '\061', - '\012', '\156', '\120', '\172', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\167', '\125', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\112', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\171', '\121', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\130', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\142', '\163', '\132', '\040', '\163', '\172', '\040', '\061', - '\012', '\102', '\161', '\151', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\107', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\156', '\116', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\131', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\124', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\155', '\120', '\040', '\155', '\145', '\040', '\061', - '\012', '\152', '\160', '\132', '\040', '\151', '\152', '\040', '\061', - '\012', '\115', '\161', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\152', '\115', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\126', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\165', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\102', '\153', '\040', '\145', '\162', '\040', '\061', - '\012', '\152', '\165', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\105', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\127', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\172', '\110', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\114', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\116', '\143', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\146', '\116', '\040', '\153', '\141', '\040', '\061', - '\012', '\165', '\125', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\103', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\103', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\125', '\171', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\102', '\146', '\040', '\160', '\162', '\040', '\061', - '\012', '\152', '\102', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\104', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\155', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\164', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\143', '\123', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\120', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\121', '\155', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\172', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\143', '\114', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\162', '\111', '\040', '\145', '\162', '\040', '\061', - '\012', '\144', '\166', '\116', '\040', '\166', '\141', '\040', '\061', - '\012', '\103', '\167', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\150', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\107', '\172', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\144', '\117', '\040', '\144', '\145', '\040', '\061', - '\012', '\102', '\161', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\114', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\154', '\170', '\146', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\131', '\153', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\123', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\153', '\123', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\113', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\120', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\120', '\155', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\154', '\127', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\165', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\143', '\130', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\172', '\121', '\040', '\163', '\172', '\040', '\061', - '\012', '\107', '\172', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\145', '\120', '\155', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\167', '\127', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\167', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\121', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\170', '\120', '\040', '\142', '\145', '\040', '\061', - '\012', '\144', '\155', '\104', '\040', '\144', '\145', '\040', '\061', - '\012', '\141', '\167', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\126', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\142', '\167', '\131', '\040', '\167', '\141', '\040', '\061', - '\012', '\132', '\170', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\150', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\131', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\103', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\146', '\121', '\040', '\156', '\171', '\040', '\061', - '\012', '\172', '\107', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\166', '\105', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\103', '\166', '\040', '\156', '\147', '\040', '\061', - '\012', '\157', '\120', '\146', '\040', '\157', '\156', '\040', '\061', - '\012', '\172', '\130', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\150', '\166', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\172', '\123', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\146', '\130', '\040', '\155', '\145', '\040', '\061', - '\012', '\144', '\120', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\114', '\162', '\146', '\040', '\145', '\162', '\040', '\061', - '\012', '\154', '\162', '\107', '\040', '\145', '\162', '\040', '\061', - '\012', '\155', '\131', '\146', '\040', '\155', '\145', '\040', '\061', - '\012', '\150', '\116', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\101', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\170', '\121', '\040', '\163', '\164', '\040', '\061', - '\012', '\153', '\124', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\117', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\144', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\167', '\113', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\121', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\104', '\161', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\127', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\170', '\105', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\130', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\156', '\166', '\102', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\130', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\103', '\161', '\151', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\172', '\127', '\040', '\163', '\172', '\040', '\061', - '\012', '\162', '\122', '\146', '\040', '\145', '\162', '\040', '\061', - '\012', '\155', '\132', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\156', '\106', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\141', '\107', '\040', '\141', '\156', '\040', '\061', - '\012', '\102', '\161', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\115', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\110', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\114', '\152', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\115', '\167', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\160', '\172', '\113', '\040', '\163', '\172', '\040', '\061', - '\012', '\155', '\120', '\142', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\152', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\122', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\132', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\156', '\161', '\107', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\126', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\152', '\103', '\040', '\151', '\152', '\040', '\061', - '\012', '\165', '\110', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\104', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\161', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\147', '\125', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\112', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\172', '\156', '\113', '\040', '\141', '\156', '\040', '\061', - '\012', '\162', '\150', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\104', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\112', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\153', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\156', '\112', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\122', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\172', '\101', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\121', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\124', '\170', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\142', '\153', '\107', '\040', '\153', '\141', '\040', '\061', - '\012', '\171', '\167', '\132', '\040', '\167', '\141', '\040', '\061', - '\012', '\172', '\127', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\150', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\155', '\106', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\146', '\121', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\155', '\107', '\040', '\163', '\172', '\040', '\061', - '\012', '\117', '\147', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\165', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\101', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\104', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\126', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\122', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\170', '\155', '\115', '\040', '\155', '\145', '\040', '\061', - '\012', '\160', '\170', '\102', '\040', '\160', '\162', '\040', '\061', - '\012', '\172', '\164', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\172', '\112', '\040', '\163', '\172', '\040', '\061', - '\012', '\156', '\106', '\172', '\040', '\141', '\156', '\040', '\061', - '\012', '\165', '\126', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\156', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\107', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\144', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\126', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\115', '\150', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\161', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\110', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\167', '\103', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\153', '\107', '\040', '\166', '\141', '\040', '\061', - '\012', '\130', '\153', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\164', '\122', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\166', '\126', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\167', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\150', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\167', '\117', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\121', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\162', '\122', '\040', '\143', '\150', '\040', '\061', - '\012', '\115', '\162', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\121', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\155', '\102', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\125', '\171', '\040', '\166', '\141', '\040', '\061', - '\012', '\164', '\167', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\147', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\116', '\170', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\150', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\160', '\130', '\040', '\160', '\162', '\040', '\061', - '\012', '\146', '\166', '\104', '\040', '\166', '\141', '\040', '\061', - '\012', '\103', '\166', '\171', '\040', '\166', '\141', '\040', '\061', - '\012', '\157', '\110', '\152', '\040', '\157', '\156', '\040', '\061', - '\012', '\121', '\161', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\131', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\150', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\132', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\171', '\113', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\170', '\131', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\143', '\125', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\105', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\130', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\155', '\154', '\121', '\040', '\154', '\145', '\040', '\061', - '\012', '\107', '\147', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\114', '\160', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\170', '\125', '\040', '\156', '\171', '\040', '\061', - '\012', '\147', '\166', '\112', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\161', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\163', '\116', '\040', '\163', '\172', '\040', '\061', - '\012', '\111', '\152', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\142', '\112', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\115', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\153', '\130', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\162', '\124', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\117', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\160', '\107', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\107', '\153', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\103', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\161', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\104', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\156', '\121', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\144', '\126', '\040', '\144', '\145', '\040', '\061', - '\012', '\142', '\147', '\123', '\040', '\156', '\147', '\040', '\061', - '\012', '\124', '\161', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\105', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\150', '\132', '\163', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\131', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\120', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\150', '\147', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\120', '\166', '\171', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\170', '\113', '\040', '\146', '\157', '\040', '\061', - '\012', '\110', '\167', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\170', '\122', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\144', '\155', '\120', '\040', '\144', '\145', '\040', '\061', - '\012', '\155', '\143', '\131', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\170', '\122', '\040', '\142', '\145', '\040', '\061', - '\012', '\114', '\163', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\122', '\154', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\167', '\121', '\040', '\151', '\156', '\040', '\061', - '\012', '\127', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\146', '\126', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\167', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\160', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\155', '\162', '\117', '\040', '\145', '\162', '\040', '\061', - '\012', '\151', '\106', '\143', '\040', '\164', '\151', '\040', '\061', - '\012', '\167', '\172', '\104', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\142', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\146', '\123', '\040', '\146', '\157', '\040', '\061', - '\012', '\120', '\161', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\131', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\154', '\104', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\164', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\172', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\152', '\113', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\104', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\156', '\103', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\103', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\170', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\115', '\166', '\040', '\157', '\156', '\040', '\061', - '\012', '\143', '\147', '\131', '\040', '\143', '\150', '\040', '\061', - '\012', '\127', '\161', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\153', '\121', '\040', '\153', '\141', '\040', '\061', - '\012', '\164', '\161', '\117', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\156', '\103', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\107', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\102', '\146', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\131', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\160', '\143', '\114', '\040', '\143', '\150', '\040', '\061', - '\012', '\106', '\147', '\160', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\164', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\150', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\125', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\156', '\116', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\124', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\163', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\141', '\112', '\147', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\121', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\107', '\156', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\155', '\115', '\040', '\155', '\145', '\040', '\061', - '\012', '\172', '\161', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\152', '\132', '\040', '\156', '\147', '\040', '\061', - '\012', '\156', '\170', '\110', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\144', '\117', '\040', '\143', '\150', '\040', '\061', - '\012', '\141', '\101', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\125', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\130', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\102', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\147', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\132', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\112', '\153', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\160', '\166', '\104', '\040', '\166', '\141', '\040', '\061', - '\012', '\142', '\155', '\124', '\040', '\155', '\145', '\040', '\061', - '\012', '\157', '\131', '\170', '\040', '\157', '\156', '\040', '\061', - '\012', '\150', '\167', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\152', '\102', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\131', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\151', '\110', '\170', '\040', '\151', '\156', '\040', '\061', - '\012', '\154', '\131', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\103', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\146', '\150', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\104', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\103', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\170', '\102', '\040', '\154', '\145', '\040', '\061', - '\012', '\145', '\130', '\152', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\166', '\127', '\040', '\166', '\141', '\040', '\061', - '\012', '\143', '\143', '\127', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\124', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\161', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\116', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\153', '\115', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\122', '\166', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\156', '\111', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\167', '\103', '\040', '\167', '\141', '\040', '\061', - '\012', '\172', '\161', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\121', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\170', '\162', '\103', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\106', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\157', '\145', '\121', '\040', '\145', '\162', '\040', '\061', - '\012', '\155', '\114', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\167', '\124', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\167', '\104', '\040', '\167', '\141', '\040', '\061', - '\012', '\166', '\160', '\105', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\154', '\131', '\040', '\154', '\145', '\040', '\061', - '\012', '\163', '\122', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\123', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\165', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\162', '\111', '\040', '\145', '\162', '\040', '\061', - '\012', '\131', '\163', '\156', '\040', '\163', '\164', '\040', '\061', - '\012', '\126', '\150', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\103', '\161', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\131', '\147', '\142', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\120', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\153', '\102', '\040', '\153', '\141', '\040', '\061', - '\012', '\164', '\122', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\141', '\152', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\143', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\104', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\121', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\145', '\125', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\143', '\115', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\126', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\122', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\106', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\142', '\127', '\040', '\142', '\145', '\040', '\061', - '\012', '\165', '\125', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\116', '\150', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\131', '\153', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\127', '\164', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\115', '\172', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\156', '\160', '\124', '\040', '\151', '\156', '\040', '\061', - '\012', '\130', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\167', '\116', '\040', '\167', '\141', '\040', '\061', - '\012', '\150', '\130', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\114', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\107', '\170', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\144', '\104', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\102', '\146', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\146', '\153', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\152', '\117', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\104', '\144', '\153', '\040', '\144', '\145', '\040', '\061', - '\012', '\116', '\152', '\160', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\152', '\112', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\150', '\123', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\167', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\171', '\127', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\156', '\106', '\166', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\114', '\142', '\040', '\160', '\162', '\040', '\061', - '\012', '\161', '\142', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\155', '\130', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\156', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\121', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\172', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\116', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\160', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\102', '\170', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\147', '\107', '\040', '\156', '\147', '\040', '\061', - '\012', '\122', '\154', '\152', '\040', '\154', '\145', '\040', '\061', - '\012', '\151', '\110', '\161', '\040', '\151', '\156', '\040', '\061', - '\012', '\163', '\167', '\116', '\040', '\163', '\172', '\040', '\061', - '\012', '\116', '\152', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\120', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\157', '\122', '\166', '\040', '\157', '\156', '\040', '\061', - '\012', '\160', '\112', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\153', '\132', '\167', '\040', '\153', '\141', '\040', '\061', - '\012', '\166', '\126', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\126', '\142', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\106', '\146', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\172', '\121', '\040', '\163', '\172', '\040', '\061', - '\012', '\107', '\166', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\120', '\147', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\120', '\160', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\103', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\153', '\116', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\142', '\155', '\104', '\040', '\155', '\145', '\040', '\061', - '\012', '\155', '\127', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\154', '\106', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\151', '\130', '\040', '\151', '\156', '\040', '\061', - '\012', '\171', '\122', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\154', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\146', '\132', '\040', '\163', '\172', '\040', '\061', - '\012', '\127', '\146', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\166', '\162', '\117', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\170', '\124', '\040', '\156', '\147', '\040', '\061', - '\012', '\154', '\167', '\105', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\144', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\160', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\121', '\160', '\146', '\040', '\160', '\162', '\040', '\061', - '\012', '\132', '\156', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\146', '\112', '\040', '\142', '\145', '\040', '\061', - '\012', '\161', '\121', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\101', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\141', '\161', '\127', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\161', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\167', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\116', '\156', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\114', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\127', '\164', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\143', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\152', '\122', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\127', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\132', '\155', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\132', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\131', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\126', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\130', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\167', '\112', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\167', '\132', '\040', '\151', '\152', '\040', '\061', - '\012', '\154', '\167', '\114', '\040', '\154', '\145', '\040', '\061', - '\012', '\145', '\107', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\123', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\102', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\163', '\123', '\040', '\163', '\172', '\040', '\061', - '\012', '\153', '\156', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\116', '\156', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\155', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\123', '\161', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\146', '\121', '\040', '\146', '\157', '\040', '\061', - '\012', '\126', '\143', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\155', '\104', '\040', '\155', '\145', '\040', '\061', - '\012', '\172', '\131', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\101', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\156', '\142', '\127', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\112', '\155', '\040', '\156', '\147', '\040', '\061', - '\012', '\112', '\167', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\170', '\112', '\040', '\155', '\145', '\040', '\061', - '\012', '\170', '\142', '\103', '\040', '\142', '\145', '\040', '\061', - '\012', '\122', '\142', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\132', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\112', '\171', '\040', '\142', '\145', '\040', '\061', - '\012', '\130', '\171', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\153', '\126', '\040', '\163', '\172', '\040', '\061', - '\012', '\165', '\157', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\143', '\125', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\132', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\162', '\120', '\155', '\040', '\145', '\162', '\040', '\061', - '\012', '\162', '\107', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\154', '\143', '\114', '\040', '\143', '\150', '\040', '\061', - '\012', '\162', '\126', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\103', '\147', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\103', '\164', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\145', '\107', '\166', '\040', '\145', '\162', '\040', '\061', - '\012', '\122', '\172', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\121', '\150', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\114', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\126', '\161', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\144', '\112', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\126', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\164', '\114', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\146', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\170', '\126', '\040', '\167', '\141', '\040', '\061', - '\012', '\171', '\122', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\170', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\131', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\150', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\114', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\132', '\166', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\166', '\155', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\143', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\115', '\167', '\160', '\040', '\167', '\141', '\040', '\061', - '\012', '\143', '\124', '\147', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\130', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\121', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\112', '\142', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\171', '\146', '\107', '\040', '\156', '\171', '\040', '\061', - '\012', '\160', '\150', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\152', '\110', '\040', '\156', '\147', '\040', '\061', - '\012', '\127', '\144', '\147', '\040', '\144', '\145', '\040', '\061', - '\012', '\160', '\120', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\102', '\167', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\156', '\102', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\167', '\112', '\040', '\167', '\141', '\040', '\061', - '\012', '\165', '\164', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\152', '\103', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\126', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\143', '\124', '\155', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\115', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\113', '\147', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\156', '\122', '\144', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\115', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\152', '\121', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\131', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\131', '\152', '\040', '\163', '\164', '\040', '\061', - '\012', '\152', '\116', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\130', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\172', '\102', '\040', '\163', '\172', '\040', '\061', - '\012', '\123', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\164', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\131', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\147', '\154', '\124', '\040', '\156', '\147', '\040', '\061', - '\012', '\125', '\165', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\165', '\117', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\151', '\102', '\170', '\040', '\151', '\156', '\040', '\061', - '\012', '\122', '\161', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\127', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\110', '\143', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\116', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\121', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\151', '\110', '\144', '\040', '\151', '\156', '\040', '\061', - '\012', '\127', '\160', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\156', '\146', '\131', '\040', '\141', '\156', '\040', '\061', - '\012', '\122', '\153', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\113', '\161', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\146', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\153', '\162', '\103', '\040', '\145', '\162', '\040', '\061', - '\012', '\127', '\150', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\152', '\115', '\040', '\154', '\145', '\040', '\061', - '\012', '\171', '\170', '\107', '\040', '\156', '\171', '\040', '\061', - '\012', '\146', '\160', '\127', '\040', '\160', '\162', '\040', '\061', - '\012', '\142', '\143', '\106', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\162', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\165', '\104', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\172', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\167', '\120', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\114', '\146', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\102', '\153', '\160', '\040', '\153', '\141', '\040', '\061', - '\012', '\130', '\153', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\170', '\110', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\111', '\152', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\124', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\105', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\161', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\154', '\104', '\040', '\154', '\145', '\040', '\061', - '\012', '\164', '\106', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\116', '\146', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\106', '\161', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\124', '\172', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\163', '\112', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\111', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\106', '\142', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\172', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\126', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\126', '\161', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\161', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\144', '\112', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\111', '\160', '\040', '\144', '\145', '\040', '\061', - '\012', '\132', '\156', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\153', '\113', '\040', '\151', '\152', '\040', '\061', - '\012', '\162', '\146', '\121', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\153', '\111', '\040', '\153', '\165', '\040', '\061', - '\012', '\146', '\111', '\157', '\040', '\162', '\157', '\040', '\061', - '\012', '\154', '\161', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\160', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\160', '\101', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\162', '\162', '\121', '\040', '\145', '\162', '\040', '\061', - '\012', '\142', '\111', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\104', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\157', '\110', '\170', '\040', '\157', '\156', '\040', '\061', - '\012', '\167', '\112', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\103', '\161', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\166', '\102', '\040', '\166', '\141', '\040', '\061', - '\012', '\171', '\161', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\114', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\106', '\172', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\132', '\146', '\040', '\144', '\145', '\040', '\061', - '\012', '\116', '\161', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\122', '\156', '\172', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\124', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\126', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\106', '\144', '\155', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\146', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\167', '\123', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\120', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\107', '\170', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\106', '\166', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\132', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\172', '\126', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\155', '\102', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\130', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\120', '\154', '\167', '\040', '\154', '\145', '\040', '\061', - '\012', '\116', '\154', '\170', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\103', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\113', '\167', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\112', '\161', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\107', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\165', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\172', '\114', '\040', '\163', '\172', '\040', '\061', - '\012', '\151', '\106', '\170', '\040', '\151', '\156', '\040', '\061', - '\012', '\146', '\124', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\171', '\127', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\143', '\110', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\106', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\155', '\161', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\141', '\121', '\153', '\040', '\141', '\156', '\040', '\061', - '\012', '\165', '\104', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\142', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\160', '\147', '\112', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\153', '\116', '\040', '\153', '\141', '\040', '\061', - '\012', '\160', '\102', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\102', '\144', '\166', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\155', '\127', '\040', '\151', '\152', '\040', '\061', - '\012', '\112', '\166', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\130', '\160', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\121', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\144', '\107', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\153', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\123', '\144', '\040', '\143', '\150', '\040', '\061', - '\012', '\106', '\144', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\147', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\144', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\116', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\145', '\126', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\146', '\101', '\040', '\144', '\145', '\040', '\061', - '\012', '\110', '\172', '\171', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\127', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\170', '\110', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\170', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\113', '\150', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\121', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\160', '\167', '\124', '\040', '\160', '\162', '\040', '\061', - '\012', '\114', '\167', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\172', '\104', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\170', '\113', '\040', '\153', '\141', '\040', '\061', - '\012', '\155', '\164', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\150', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\167', '\122', '\040', '\167', '\141', '\040', '\061', - '\012', '\152', '\111', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\127', '\172', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\161', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\154', '\132', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\115', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\167', '\160', '\122', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\110', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\141', '\117', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\153', '\125', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\122', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\152', '\130', '\040', '\166', '\141', '\040', '\061', - '\012', '\143', '\165', '\121', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\155', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\165', '\112', '\040', '\157', '\165', '\040', '\061', - '\012', '\171', '\127', '\170', '\040', '\156', '\171', '\040', '\061', - '\012', '\150', '\125', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\172', '\120', '\040', '\166', '\141', '\040', '\061', - '\012', '\162', '\123', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\147', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\172', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\152', '\102', '\040', '\163', '\172', '\040', '\061', - '\012', '\123', '\152', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\146', '\101', '\040', '\146', '\157', '\040', '\061', - '\012', '\146', '\110', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\153', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\144', '\106', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\127', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\142', '\101', '\040', '\151', '\152', '\040', '\061', - '\012', '\102', '\155', '\142', '\040', '\155', '\145', '\040', '\061', - '\012', '\171', '\152', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\162', '\170', '\132', '\040', '\145', '\162', '\040', '\061', - '\012', '\126', '\155', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\151', '\111', '\161', '\040', '\151', '\156', '\040', '\061', - '\012', '\127', '\147', '\154', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\122', '\160', '\040', '\155', '\145', '\040', '\061', - '\012', '\167', '\166', '\123', '\040', '\166', '\141', '\040', '\061', - '\012', '\125', '\166', '\171', '\040', '\166', '\141', '\040', '\061', - '\012', '\171', '\160', '\121', '\040', '\160', '\162', '\040', '\061', - '\012', '\166', '\106', '\167', '\040', '\166', '\157', '\040', '\061', - '\012', '\146', '\161', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\167', '\112', '\040', '\163', '\164', '\040', '\061', - '\012', '\112', '\162', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\170', '\105', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\132', '\153', '\040', '\154', '\145', '\040', '\061', - '\012', '\146', '\126', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\150', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\150', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\123', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\121', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\110', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\165', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\160', '\107', '\040', '\151', '\152', '\040', '\061', - '\012', '\120', '\153', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\121', '\142', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\106', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\107', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\163', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\167', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\171', '\121', '\040', '\156', '\171', '\040', '\061', - '\012', '\144', '\161', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\110', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\115', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\113', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\114', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\155', '\117', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\102', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\160', '\152', '\121', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\132', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\111', '\165', '\040', '\165', '\156', '\040', '\061', - '\012', '\171', '\143', '\131', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\104', '\146', '\040', '\155', '\145', '\040', '\061', - '\012', '\171', '\112', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\111', '\163', '\170', '\040', '\163', '\164', '\040', '\061', - '\012', '\121', '\161', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\106', '\153', '\167', '\040', '\153', '\141', '\040', '\061', - '\012', '\103', '\160', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\131', '\166', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\152', '\107', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\107', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\144', '\155', '\040', '\144', '\145', '\040', '\061', - '\012', '\150', '\102', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\170', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\131', '\167', '\142', '\040', '\157', '\167', '\040', '\061', - '\012', '\126', '\164', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\152', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\104', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\165', '\107', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\166', '\106', '\040', '\166', '\141', '\040', '\061', - '\012', '\165', '\161', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\167', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\102', '\147', '\142', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\156', '\125', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\160', '\111', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\113', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\130', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\153', '\114', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\147', '\131', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\170', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\110', '\150', '\171', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\160', '\112', '\040', '\160', '\162', '\040', '\061', - '\012', '\143', '\126', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\126', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\112', '\172', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\156', '\104', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\152', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\132', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\161', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\106', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\116', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\106', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\110', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\122', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\170', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\160', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\156', '\115', '\153', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\152', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\150', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\160', '\104', '\040', '\160', '\162', '\040', '\061', - '\012', '\104', '\146', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\171', '\117', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\150', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\126', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\156', '\113', '\143', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\153', '\112', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\167', '\123', '\040', '\143', '\150', '\040', '\061', - '\012', '\157', '\104', '\146', '\040', '\157', '\156', '\040', '\061', - '\012', '\155', '\153', '\131', '\040', '\153', '\141', '\040', '\061', - '\012', '\147', '\144', '\126', '\040', '\156', '\147', '\040', '\061', - '\012', '\130', '\150', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\125', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\141', '\112', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\121', '\170', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\172', '\123', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\125', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\124', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\157', '\126', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\144', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\110', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\170', '\113', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\142', '\106', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\127', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\161', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\155', '\110', '\040', '\144', '\145', '\040', '\061', - '\012', '\124', '\164', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\121', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\106', '\150', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\143', '\131', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\163', '\122', '\040', '\163', '\164', '\040', '\061', - '\012', '\151', '\127', '\147', '\040', '\151', '\156', '\040', '\061', - '\012', '\130', '\171', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\130', '\152', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\170', '\160', '\142', '\040', '\160', '\162', '\040', '\061', - '\012', '\154', '\172', '\131', '\040', '\154', '\145', '\040', '\061', - '\012', '\160', '\172', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\126', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\111', '\152', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\166', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\156', '\142', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\144', '\110', '\040', '\144', '\145', '\040', '\061', - '\012', '\143', '\104', '\144', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\161', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\146', '\125', '\040', '\156', '\171', '\040', '\061', - '\012', '\161', '\157', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\153', '\167', '\040', '\153', '\141', '\040', '\061', - '\012', '\113', '\143', '\153', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\125', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\127', '\155', '\040', '\163', '\172', '\040', '\061', - '\012', '\102', '\146', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\162', '\121', '\152', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\145', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\160', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\161', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\172', '\117', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\152', '\121', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\124', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\122', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\144', '\121', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\142', '\121', '\040', '\167', '\141', '\040', '\061', - '\012', '\121', '\160', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\111', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\170', '\116', '\040', '\156', '\171', '\040', '\061', - '\012', '\156', '\103', '\153', '\040', '\141', '\156', '\040', '\061', - '\012', '\112', '\161', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\105', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\144', '\105', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\103', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\121', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\113', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\124', '\152', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\132', '\143', '\171', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\155', '\122', '\040', '\153', '\141', '\040', '\061', - '\012', '\143', '\124', '\160', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\161', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\166', '\132', '\040', '\166', '\141', '\040', '\061', - '\012', '\143', '\114', '\167', '\040', '\143', '\150', '\040', '\061', - '\012', '\157', '\111', '\167', '\040', '\157', '\156', '\040', '\061', - '\012', '\170', '\152', '\107', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\164', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\143', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\147', '\124', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\161', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\165', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\163', '\131', '\040', '\163', '\164', '\040', '\061', - '\012', '\152', '\103', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\106', '\142', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\161', '\110', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\152', '\172', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\147', '\122', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\151', '\130', '\040', '\151', '\156', '\040', '\061', - '\012', '\161', '\156', '\117', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\155', '\116', '\040', '\155', '\145', '\040', '\061', - '\012', '\167', '\147', '\110', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\142', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\153', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\160', '\172', '\103', '\040', '\160', '\157', '\040', '\061', - '\012', '\154', '\146', '\130', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\102', '\165', '\040', '\165', '\156', '\040', '\061', - '\012', '\155', '\114', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\160', '\155', '\131', '\040', '\155', '\145', '\040', '\061', - '\012', '\170', '\161', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\152', '\131', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\162', '\110', '\040', '\145', '\162', '\040', '\061', - '\012', '\111', '\165', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\146', '\104', '\040', '\156', '\171', '\040', '\061', - '\012', '\143', '\154', '\107', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\144', '\132', '\040', '\143', '\150', '\040', '\061', - '\012', '\145', '\124', '\144', '\040', '\145', '\162', '\040', '\061', - '\012', '\154', '\130', '\166', '\040', '\154', '\145', '\040', '\061', - '\012', '\153', '\160', '\126', '\040', '\153', '\141', '\040', '\061', - '\012', '\163', '\132', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\170', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\155', '\112', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\153', '\105', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\125', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\103', '\161', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\103', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\170', '\121', '\040', '\160', '\162', '\040', '\061', - '\012', '\131', '\167', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\170', '\167', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\127', '\152', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\161', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\124', '\160', '\040', '\156', '\147', '\040', '\061', - '\012', '\165', '\132', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\144', '\110', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\165', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\126', '\155', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\152', '\131', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\150', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\146', '\104', '\040', '\167', '\141', '\040', '\061', - '\012', '\132', '\152', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\151', '\120', '\166', '\040', '\151', '\156', '\040', '\061', - '\012', '\155', '\172', '\127', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\130', '\155', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\105', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\117', '\172', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\105', '\160', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\104', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\132', '\154', '\167', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\142', '\122', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\103', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\157', '\131', '\040', '\157', '\156', '\040', '\061', - '\012', '\160', '\153', '\124', '\040', '\153', '\141', '\040', '\061', - '\012', '\153', '\142', '\111', '\040', '\153', '\141', '\040', '\061', - '\012', '\150', '\144', '\127', '\040', '\144', '\145', '\040', '\061', - '\012', '\110', '\163', '\170', '\040', '\163', '\164', '\040', '\061', - '\012', '\172', '\160', '\130', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\146', '\126', '\040', '\163', '\172', '\040', '\061', - '\012', '\104', '\150', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\115', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\150', '\172', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\114', '\167', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\172', '\155', '\116', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\146', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\152', '\121', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\153', '\113', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\102', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\142', '\144', '\105', '\040', '\144', '\145', '\040', '\061', - '\012', '\121', '\170', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\161', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\150', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\131', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\150', '\105', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\142', '\106', '\040', '\143', '\150', '\040', '\061', - '\012', '\112', '\156', '\142', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\170', '\116', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\131', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\150', '\112', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\122', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\156', '\123', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\114', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\143', '\102', '\144', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\161', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\123', '\144', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\145', '\132', '\040', '\145', '\162', '\040', '\061', - '\012', '\112', '\167', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\144', '\120', '\146', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\116', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\153', '\111', '\142', '\040', '\153', '\141', '\040', '\061', - '\012', '\143', '\142', '\114', '\040', '\143', '\150', '\040', '\061', - '\012', '\121', '\144', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\115', '\146', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\152', '\112', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\155', '\170', '\131', '\040', '\155', '\145', '\040', '\061', - '\012', '\154', '\106', '\144', '\040', '\154', '\145', '\040', '\061', - '\012', '\164', '\167', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\106', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\143', '\162', '\102', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\122', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\110', '\164', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\131', '\146', '\040', '\160', '\162', '\040', '\061', - '\012', '\162', '\126', '\143', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\122', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\126', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\160', '\101', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\154', '\131', '\040', '\154', '\145', '\040', '\061', - '\012', '\163', '\116', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\113', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\164', '\166', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\131', '\152', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\167', '\120', '\040', '\155', '\145', '\040', '\061', - '\012', '\112', '\171', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\164', '\102', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\123', '\142', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\115', '\154', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\152', '\112', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\131', '\172', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\120', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\161', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\106', '\166', '\040', '\163', '\164', '\040', '\061', - '\012', '\170', '\153', '\110', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\132', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\150', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\167', '\116', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\152', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\121', '\155', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\115', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\143', '\127', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\112', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\124', '\155', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\155', '\121', '\040', '\153', '\141', '\040', '\061', - '\012', '\127', '\154', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\131', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\145', '\112', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\124', '\153', '\142', '\040', '\153', '\141', '\040', '\061', - '\012', '\150', '\146', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\170', '\131', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\104', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\143', '\116', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\121', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\157', '\150', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\122', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\142', '\126', '\040', '\154', '\145', '\040', '\061', - '\012', '\154', '\113', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\170', '\102', '\040', '\167', '\141', '\040', '\061', - '\012', '\114', '\167', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\146', '\161', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\153', '\132', '\040', '\153', '\141', '\040', '\061', - '\012', '\151', '\167', '\117', '\040', '\151', '\156', '\040', '\061', - '\012', '\144', '\147', '\125', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\166', '\117', '\040', '\144', '\145', '\040', '\061', - '\012', '\160', '\104', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\166', '\113', '\040', '\153', '\141', '\040', '\061', - '\012', '\152', '\154', '\126', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\130', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\153', '\106', '\040', '\153', '\165', '\040', '\061', - '\012', '\151', '\171', '\124', '\040', '\151', '\156', '\040', '\061', - '\012', '\125', '\146', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\156', '\172', '\125', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\142', '\110', '\040', '\142', '\165', '\040', '\061', - '\012', '\154', '\123', '\142', '\040', '\154', '\145', '\040', '\061', - '\012', '\130', '\160', '\146', '\040', '\160', '\162', '\040', '\061', - '\012', '\125', '\166', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\171', '\171', '\106', '\040', '\156', '\171', '\040', '\061', - '\012', '\146', '\170', '\120', '\040', '\146', '\157', '\040', '\061', - '\012', '\152', '\131', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\152', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\170', '\114', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\167', '\111', '\040', '\160', '\162', '\040', '\061', - '\012', '\152', '\125', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\162', '\106', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\163', '\106', '\040', '\163', '\164', '\040', '\061', - '\012', '\143', '\144', '\127', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\167', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\170', '\144', '\110', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\131', '\163', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\106', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\111', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\111', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\124', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\146', '\105', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\122', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\150', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\115', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\160', '\102', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\170', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\120', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\156', '\142', '\102', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\153', '\121', '\040', '\163', '\164', '\040', '\061', - '\012', '\165', '\113', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\121', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\153', '\127', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\167', '\161', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\167', '\101', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\112', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\150', '\143', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\146', '\113', '\040', '\141', '\156', '\040', '\061', - '\012', '\165', '\130', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\147', '\101', '\040', '\143', '\150', '\040', '\061', - '\012', '\120', '\152', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\114', '\161', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\167', '\103', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\152', '\116', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\153', '\120', '\040', '\153', '\141', '\040', '\061', - '\012', '\122', '\161', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\107', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\120', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\142', '\124', '\040', '\153', '\141', '\040', '\061', - '\012', '\153', '\160', '\121', '\040', '\153', '\141', '\040', '\061', - '\012', '\115', '\172', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\152', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\153', '\104', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\167', '\122', '\040', '\151', '\152', '\040', '\061', - '\012', '\127', '\171', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\170', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\107', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\166', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\172', '\116', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\103', '\155', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\154', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\102', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\155', '\112', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\106', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\104', '\155', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\146', '\103', '\040', '\160', '\162', '\040', '\061', - '\012', '\114', '\160', '\171', '\040', '\160', '\162', '\040', '\061', - '\012', '\106', '\150', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\170', '\123', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\127', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\106', '\147', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\156', '\106', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\170', '\106', '\040', '\143', '\150', '\040', '\061', - '\012', '\141', '\126', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\123', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\152', '\172', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\156', '\103', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\161', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\162', '\132', '\040', '\145', '\162', '\040', '\061', - '\012', '\142', '\116', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\156', '\166', '\127', '\040', '\141', '\156', '\040', '\061', - '\012', '\121', '\171', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\106', '\150', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\107', '\166', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\114', '\160', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\114', '\142', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\113', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\112', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\152', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\156', '\121', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\156', '\160', '\130', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\151', '\117', '\040', '\151', '\156', '\040', '\061', - '\012', '\166', '\166', '\107', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\117', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\150', '\150', '\105', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\144', '\116', '\040', '\144', '\145', '\040', '\061', - '\012', '\103', '\172', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\152', '\125', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\126', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\113', '\143', '\147', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\166', '\110', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\164', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\111', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\152', '\121', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\106', '\171', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\160', '\125', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\170', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\142', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\166', '\112', '\040', '\163', '\164', '\040', '\061', - '\012', '\166', '\152', '\127', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\160', '\131', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\156', '\122', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\121', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\103', '\166', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\153', '\102', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\147', '\102', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\146', '\104', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\110', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\144', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\124', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\154', '\124', '\155', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\147', '\102', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\170', '\123', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\120', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\160', '\121', '\040', '\160', '\162', '\040', '\061', - '\012', '\171', '\170', '\127', '\040', '\156', '\171', '\040', '\061', - '\012', '\110', '\152', '\153', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\116', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\143', '\156', '\112', '\040', '\141', '\156', '\040', '\061', - '\012', '\165', '\110', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\166', '\110', '\040', '\151', '\152', '\040', '\061', - '\012', '\107', '\147', '\156', '\040', '\156', '\147', '\040', '\061', - '\012', '\154', '\142', '\123', '\040', '\154', '\145', '\040', '\061', - '\012', '\121', '\143', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\161', '\122', '\040', '\143', '\150', '\040', '\061', - '\012', '\112', '\171', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\122', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\156', '\146', '\101', '\040', '\141', '\156', '\040', '\061', - '\012', '\154', '\130', '\167', '\040', '\154', '\145', '\040', '\061', - '\012', '\143', '\155', '\112', '\040', '\143', '\150', '\040', '\061', - '\012', '\131', '\163', '\167', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\121', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\163', '\130', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\111', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\152', '\132', '\040', '\151', '\152', '\040', '\061', - '\012', '\114', '\154', '\142', '\040', '\154', '\145', '\040', '\061', - '\012', '\155', '\115', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\154', '\126', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\160', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\155', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\170', '\115', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\107', '\167', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\121', '\152', '\166', '\040', '\151', '\152', '\040', '\061', - '\012', '\154', '\161', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\112', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\153', '\171', '\040', '\153', '\141', '\040', '\061', - '\012', '\150', '\104', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\114', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\131', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\103', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\155', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\124', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\153', '\106', '\040', '\153', '\141', '\040', '\061', - '\012', '\150', '\106', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\156', '\102', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\171', '\112', '\040', '\156', '\171', '\040', '\061', - '\012', '\156', '\111', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\131', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\127', '\161', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\161', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\131', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\121', '\144', '\172', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\142', '\116', '\040', '\142', '\145', '\040', '\061', - '\012', '\161', '\167', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\125', '\142', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\167', '\164', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\121', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\112', '\153', '\040', '\151', '\152', '\040', '\061', - '\012', '\116', '\172', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\144', '\103', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\116', '\146', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\110', '\147', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\143', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\166', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\163', '\170', '\112', '\040', '\163', '\164', '\040', '\061', - '\012', '\167', '\115', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\106', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\107', '\172', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\146', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\144', '\121', '\040', '\144', '\145', '\040', '\061', - '\012', '\130', '\147', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\153', '\111', '\040', '\153', '\141', '\040', '\061', - '\012', '\160', '\166', '\113', '\040', '\166', '\141', '\040', '\061', - '\012', '\103', '\161', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\106', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\157', '\110', '\155', '\040', '\157', '\156', '\040', '\061', - '\012', '\141', '\112', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\106', '\172', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\127', '\153', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\155', '\105', '\040', '\155', '\145', '\040', '\061', - '\012', '\163', '\115', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\164', '\102', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\116', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\121', '\144', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\150', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\101', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\162', '\115', '\040', '\145', '\162', '\040', '\061', - '\012', '\162', '\110', '\167', '\040', '\145', '\162', '\040', '\061', - '\012', '\114', '\166', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\122', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\152', '\126', '\040', '\151', '\152', '\040', '\061', - '\012', '\150', '\122', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\153', '\126', '\040', '\153', '\141', '\040', '\061', - '\012', '\152', '\127', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\131', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\124', '\171', '\040', '\166', '\141', '\040', '\061', - '\012', '\144', '\170', '\126', '\040', '\144', '\145', '\040', '\061', - '\012', '\155', '\113', '\171', '\040', '\155', '\145', '\040', '\061', - '\012', '\121', '\154', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\125', '\160', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\121', '\160', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\167', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\171', '\130', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\124', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\156', '\124', '\040', '\141', '\156', '\040', '\061', - '\012', '\126', '\154', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\161', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\144', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\130', '\161', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\104', '\146', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\157', '\145', '\117', '\040', '\157', '\156', '\040', '\061', - '\012', '\156', '\103', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\154', '\130', '\144', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\110', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\101', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\131', '\142', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\172', '\104', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\107', '\153', '\040', '\144', '\145', '\040', '\061', - '\012', '\160', '\154', '\110', '\040', '\154', '\145', '\040', '\061', - '\012', '\154', '\170', '\107', '\040', '\154', '\145', '\040', '\061', - '\012', '\110', '\147', '\160', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\122', '\172', '\040', '\151', '\152', '\040', '\061', - '\012', '\144', '\124', '\163', '\040', '\144', '\145', '\040', '\061', - '\012', '\155', '\103', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\154', '\110', '\146', '\040', '\154', '\145', '\040', '\061', - '\012', '\154', '\114', '\152', '\040', '\154', '\145', '\040', '\061', - '\012', '\164', '\116', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\113', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\147', '\107', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\154', '\121', '\040', '\154', '\145', '\040', '\061', - '\012', '\131', '\171', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\104', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\130', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\172', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\105', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\154', '\150', '\123', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\172', '\115', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\161', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\143', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\142', '\106', '\040', '\142', '\145', '\040', '\061', - '\012', '\130', '\163', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\114', '\156', '\143', '\040', '\141', '\156', '\040', '\061', - '\012', '\107', '\161', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\152', '\117', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\150', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\147', '\110', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\127', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\113', '\146', '\040', '\156', '\171', '\040', '\061', - '\012', '\165', '\121', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\113', '\167', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\144', '\170', '\107', '\040', '\144', '\145', '\040', '\061', - '\012', '\131', '\161', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\113', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\127', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\143', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\146', '\131', '\040', '\167', '\141', '\040', '\061', - '\012', '\162', '\102', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\112', '\144', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\131', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\123', '\161', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\121', '\166', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\160', '\106', '\040', '\160', '\162', '\040', '\061', - '\012', '\146', '\143', '\130', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\146', '\113', '\040', '\156', '\171', '\040', '\061', - '\012', '\152', '\121', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\147', '\124', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\121', '\167', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\120', '\156', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\132', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\120', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\165', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\170', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\151', '\130', '\162', '\040', '\151', '\156', '\040', '\061', - '\012', '\160', '\143', '\105', '\040', '\143', '\150', '\040', '\061', - '\012', '\116', '\161', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\152', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\172', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\155', '\106', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\166', '\127', '\040', '\166', '\141', '\040', '\061', - '\012', '\145', '\112', '\167', '\040', '\145', '\162', '\040', '\061', - '\012', '\111', '\161', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\130', '\171', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\146', '\127', '\040', '\167', '\141', '\040', '\061', - '\012', '\126', '\144', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\112', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\120', '\144', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\102', '\152', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\114', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\144', '\127', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\121', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\172', '\127', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\167', '\121', '\040', '\166', '\141', '\040', '\061', - '\012', '\162', '\167', '\125', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\120', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\106', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\166', '\110', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\127', '\154', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\147', '\117', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\114', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\153', '\142', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\102', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\104', '\150', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\147', '\166', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\160', '\101', '\040', '\160', '\162', '\040', '\061', - '\012', '\172', '\170', '\103', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\146', '\123', '\040', '\156', '\147', '\040', '\061', - '\012', '\115', '\166', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\165', '\120', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\161', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\161', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\115', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\167', '\161', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\162', '\112', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\144', '\116', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\167', '\122', '\040', '\160', '\162', '\040', '\061', - '\012', '\150', '\115', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\120', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\126', '\142', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\172', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\116', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\112', '\142', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\124', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\132', '\146', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\106', '\172', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\113', '\143', '\167', '\040', '\143', '\150', '\040', '\061', - '\012', '\145', '\113', '\146', '\040', '\145', '\162', '\040', '\061', - '\012', '\160', '\161', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\160', '\142', '\040', '\160', '\162', '\040', '\061', - '\012', '\152', '\153', '\106', '\040', '\151', '\152', '\040', '\061', - '\012', '\126', '\170', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\150', '\107', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\102', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\143', '\124', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\115', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\132', '\166', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\153', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\111', '\146', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\144', '\122', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\132', '\154', '\152', '\040', '\154', '\145', '\040', '\061', - '\012', '\113', '\167', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\116', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\144', '\131', '\171', '\040', '\144', '\145', '\040', '\061', - '\012', '\150', '\132', '\154', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\164', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\120', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\131', '\153', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\112', '\154', '\167', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\116', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\162', '\127', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\127', '\144', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\130', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\121', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\146', '\106', '\040', '\151', '\152', '\040', '\061', - '\012', '\105', '\152', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\107', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\132', '\152', '\172', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\144', '\115', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\154', '\106', '\040', '\154', '\145', '\040', '\061', - '\012', '\143', '\170', '\132', '\040', '\143', '\150', '\040', '\061', - '\012', '\132', '\147', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\143', '\112', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\154', '\105', '\040', '\154', '\145', '\040', '\061', - '\012', '\156', '\131', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\127', '\146', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\112', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\142', '\166', '\106', '\040', '\166', '\141', '\040', '\061', - '\012', '\110', '\156', '\172', '\040', '\141', '\156', '\040', '\061', - '\012', '\127', '\153', '\166', '\040', '\153', '\141', '\040', '\061', - '\012', '\115', '\166', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\104', '\170', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\102', '\166', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\115', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\122', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\166', '\114', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\107', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\106', '\160', '\040', '\155', '\145', '\040', '\061', - '\012', '\147', '\116', '\142', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\103', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\106', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\113', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\112', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\172', '\111', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\147', '\107', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\113', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\161', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\170', '\121', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\166', '\107', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\147', '\106', '\040', '\156', '\147', '\040', '\061', - '\012', '\130', '\170', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\114', '\167', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\154', '\130', '\040', '\154', '\145', '\040', '\061', - '\012', '\154', '\120', '\172', '\040', '\154', '\145', '\040', '\061', - '\012', '\127', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\172', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\165', '\110', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\106', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\166', '\126', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\130', '\145', '\040', '\154', '\145', '\040', '\061', - '\012', '\132', '\146', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\111', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\142', '\102', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\132', '\146', '\040', '\156', '\171', '\040', '\061', - '\012', '\163', '\113', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\160', '\114', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\113', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\111', '\142', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\151', '\121', '\142', '\040', '\151', '\156', '\040', '\061', - '\012', '\106', '\170', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\106', '\160', '\142', '\040', '\160', '\162', '\040', '\061', - '\012', '\127', '\166', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\172', '\104', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\153', '\124', '\040', '\153', '\141', '\040', '\061', - '\012', '\131', '\153', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\152', '\107', '\040', '\141', '\156', '\040', '\061', - '\012', '\125', '\166', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\146', '\124', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\143', '\111', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\104', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\144', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\115', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\112', '\142', '\171', '\040', '\142', '\145', '\040', '\061', - '\012', '\154', '\167', '\112', '\040', '\154', '\145', '\040', '\061', - '\012', '\163', '\127', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\123', '\166', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\156', '\162', '\130', '\040', '\141', '\156', '\040', '\061', - '\012', '\165', '\166', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\126', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\164', '\161', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\126', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\153', '\121', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\146', '\142', '\107', '\040', '\142', '\145', '\040', '\061', - '\012', '\162', '\161', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\110', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\150', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\131', '\172', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\106', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\121', '\160', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\165', '\101', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\170', '\120', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\103', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\141', '\115', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\154', '\131', '\040', '\154', '\145', '\040', '\061', - '\012', '\143', '\124', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\102', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\143', '\121', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\122', '\142', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\126', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\107', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\144', '\116', '\040', '\144', '\145', '\040', '\061', - '\012', '\147', '\146', '\116', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\120', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\143', '\111', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\170', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\162', '\110', '\142', '\040', '\145', '\162', '\040', '\061', - '\012', '\160', '\126', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\162', '\126', '\152', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\147', '\123', '\040', '\156', '\147', '\040', '\061', - '\012', '\106', '\161', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\115', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\121', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\132', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\102', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\167', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\110', '\146', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\172', '\130', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\143', '\124', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\106', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\143', '\102', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\146', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\161', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\146', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\152', '\125', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\150', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\127', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\161', '\105', '\040', '\151', '\156', '\040', '\061', - '\012', '\147', '\160', '\125', '\040', '\156', '\147', '\040', '\061', - '\012', '\151', '\127', '\142', '\040', '\151', '\156', '\040', '\061', - '\012', '\164', '\154', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\131', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\103', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\157', '\113', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\123', '\147', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\166', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\146', '\131', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\142', '\115', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\166', '\101', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\110', '\160', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\166', '\113', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\160', '\132', '\040', '\160', '\162', '\040', '\061', - '\012', '\144', '\146', '\130', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\162', '\113', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\145', '\105', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\153', '\131', '\040', '\153', '\141', '\040', '\061', - '\012', '\163', '\142', '\130', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\143', '\123', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\113', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\154', '\170', '\040', '\154', '\145', '\040', '\061', - '\012', '\132', '\161', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\127', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\144', '\114', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\166', '\107', '\040', '\151', '\152', '\040', '\061', - '\012', '\115', '\147', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\167', '\106', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\144', '\120', '\040', '\144', '\145', '\040', '\061', - '\012', '\165', '\115', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\143', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\162', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\115', '\164', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\121', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\110', '\160', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\172', '\160', '\111', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\153', '\122', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\150', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\123', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\106', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\165', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\171', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\107', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\131', '\172', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\142', '\103', '\040', '\167', '\141', '\040', '\061', - '\012', '\167', '\123', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\163', '\132', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\122', '\172', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\106', '\154', '\170', '\040', '\154', '\145', '\040', '\061', - '\012', '\142', '\161', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\143', '\110', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\155', '\107', '\040', '\155', '\145', '\040', '\061', - '\012', '\172', '\103', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\141', '\104', '\040', '\141', '\156', '\040', '\061', - '\012', '\151', '\167', '\110', '\040', '\151', '\156', '\040', '\061', - '\012', '\161', '\104', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\107', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\130', '\150', '\171', '\040', '\164', '\150', '\040', '\061', - '\012', '\145', '\126', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\153', '\112', '\040', '\167', '\141', '\040', '\061', - '\012', '\114', '\143', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\147', '\121', '\040', '\156', '\147', '\040', '\061', - '\012', '\104', '\150', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\146', '\117', '\040', '\163', '\172', '\040', '\061', - '\012', '\153', '\126', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\155', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\117', '\167', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\167', '\132', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\156', '\116', '\040', '\141', '\156', '\040', '\061', - '\012', '\115', '\172', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\155', '\131', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\171', '\114', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\170', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\167', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\124', '\170', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\113', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\142', '\152', '\130', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\142', '\123', '\040', '\160', '\162', '\040', '\061', - '\012', '\172', '\162', '\120', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\112', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\147', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\167', '\131', '\040', '\163', '\172', '\040', '\061', - '\012', '\162', '\130', '\153', '\040', '\145', '\162', '\040', '\061', - '\012', '\156', '\104', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\107', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\155', '\121', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\160', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\114', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\126', '\146', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\167', '\103', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\143', '\147', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\132', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\152', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\121', '\141', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\162', '\107', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\112', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\112', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\143', '\115', '\144', '\040', '\143', '\150', '\040', '\061', - '\012', '\121', '\143', '\163', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\153', '\113', '\040', '\153', '\141', '\040', '\061', - '\012', '\152', '\116', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\162', '\131', '\040', '\145', '\162', '\040', '\061', - '\012', '\130', '\167', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\162', '\132', '\154', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\170', '\125', '\040', '\156', '\147', '\040', '\061', - '\012', '\114', '\156', '\166', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\147', '\103', '\040', '\156', '\147', '\040', '\061', - '\012', '\104', '\161', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\114', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\156', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\152', '\125', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\166', '\117', '\040', '\166', '\141', '\040', '\061', - '\012', '\157', '\126', '\155', '\040', '\157', '\156', '\040', '\061', - '\012', '\166', '\127', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\107', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\142', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\123', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\112', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\112', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\157', '\121', '\166', '\040', '\157', '\156', '\040', '\061', - '\012', '\126', '\167', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\156', '\125', '\040', '\141', '\156', '\040', '\061', - '\012', '\116', '\155', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\124', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\105', '\144', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\165', '\161', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\162', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\156', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\112', '\146', '\040', '\155', '\145', '\040', '\061', - '\012', '\153', '\104', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\150', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\114', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\153', '\125', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\161', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\131', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\106', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\142', '\121', '\040', '\142', '\145', '\040', '\061', - '\012', '\166', '\143', '\123', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\161', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\153', '\106', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\106', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\160', '\105', '\040', '\153', '\141', '\040', '\061', - '\012', '\107', '\170', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\132', '\164', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\111', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\153', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\144', '\126', '\040', '\144', '\145', '\040', '\061', - '\012', '\162', '\167', '\120', '\040', '\145', '\162', '\040', '\061', - '\012', '\141', '\103', '\147', '\040', '\141', '\156', '\040', '\061', - '\012', '\132', '\162', '\163', '\040', '\145', '\162', '\040', '\061', - '\012', '\172', '\155', '\127', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\146', '\117', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\102', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\142', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\104', '\170', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\144', '\104', '\040', '\144', '\145', '\040', '\061', - '\012', '\156', '\102', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\154', '\162', '\126', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\121', '\161', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\154', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\164', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\161', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\122', '\155', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\126', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\103', '\162', '\161', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\106', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\130', '\152', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\103', '\155', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\127', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\172', '\117', '\040', '\151', '\152', '\040', '\061', - '\012', '\115', '\144', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\164', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\107', '\166', '\040', '\145', '\162', '\040', '\061', - '\012', '\153', '\107', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\114', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\165', '\127', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\143', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\126', '\160', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\127', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\130', '\172', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\127', '\153', '\142', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\172', '\110', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\165', '\120', '\040', '\165', '\156', '\040', '\061', - '\012', '\144', '\110', '\166', '\040', '\144', '\145', '\040', '\061', - '\012', '\104', '\155', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\104', '\147', '\166', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\147', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\164', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\115', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\110', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\132', '\146', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\132', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\152', '\153', '\110', '\040', '\151', '\152', '\040', '\061', - '\012', '\162', '\116', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\115', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\160', '\106', '\040', '\160', '\162', '\040', '\061', - '\012', '\144', '\152', '\104', '\040', '\144', '\145', '\040', '\061', - '\012', '\142', '\170', '\126', '\040', '\142', '\145', '\040', '\061', - '\012', '\150', '\147', '\123', '\040', '\164', '\150', '\040', '\061', - '\012', '\120', '\153', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\104', '\170', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\115', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\144', '\107', '\152', '\040', '\144', '\145', '\040', '\061', - '\012', '\153', '\142', '\110', '\040', '\153', '\141', '\040', '\061', - '\012', '\114', '\150', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\104', '\166', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\162', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\111', '\152', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\165', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\167', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\150', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\143', '\122', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\150', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\147', '\120', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\153', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\161', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\170', '\131', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\126', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\154', '\113', '\144', '\040', '\154', '\145', '\040', '\061', - '\012', '\116', '\154', '\171', '\040', '\154', '\145', '\040', '\061', - '\012', '\171', '\113', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\102', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\121', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\153', '\131', '\167', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\121', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\166', '\127', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\107', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\171', '\164', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\166', '\125', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\152', '\172', '\040', '\153', '\141', '\040', '\061', - '\012', '\152', '\126', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\121', '\142', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\161', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\167', '\165', '\040', '\153', '\165', '\040', '\061', - '\012', '\121', '\167', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\144', '\143', '\132', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\150', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\155', '\123', '\040', '\156', '\147', '\040', '\061', - '\012', '\111', '\161', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\132', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\114', '\156', '\040', '\164', '\150', '\040', '\061', - '\012', '\145', '\115', '\146', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\116', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\120', '\155', '\040', '\165', '\155', '\040', '\061', - '\012', '\160', '\115', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\172', '\127', '\040', '\163', '\172', '\040', '\061', - '\012', '\153', '\122', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\172', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\142', '\117', '\040', '\142', '\145', '\040', '\061', - '\012', '\130', '\170', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\156', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\102', '\166', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\152', '\132', '\040', '\151', '\152', '\040', '\061', - '\012', '\164', '\143', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\155', '\102', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\106', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\170', '\102', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\102', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\126', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\142', '\157', '\121', '\040', '\157', '\156', '\040', '\061', - '\012', '\170', '\157', '\110', '\040', '\157', '\156', '\040', '\061', - '\012', '\144', '\127', '\147', '\040', '\144', '\145', '\040', '\061', - '\012', '\124', '\144', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\116', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\131', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\104', '\146', '\040', '\160', '\162', '\040', '\061', - '\012', '\154', '\167', '\107', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\104', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\144', '\171', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\156', '\132', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\172', '\125', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\113', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\162', '\166', '\103', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\165', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\156', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\103', '\171', '\040', '\166', '\141', '\040', '\061', - '\012', '\125', '\144', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\142', '\124', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\142', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\142', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\104', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\127', '\150', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\142', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\146', '\117', '\040', '\164', '\150', '\040', '\061', - '\012', '\124', '\146', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\142', '\127', '\040', '\144', '\145', '\040', '\061', - '\012', '\102', '\144', '\171', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\152', '\122', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\142', '\103', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\165', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\103', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\127', '\144', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\122', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\142', '\127', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\166', '\132', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\144', '\112', '\152', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\132', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\147', '\161', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\142', '\110', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\112', '\154', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\150', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\126', '\160', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\126', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\103', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\157', '\131', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\167', '\110', '\040', '\153', '\141', '\040', '\061', - '\012', '\166', '\167', '\116', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\146', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\154', '\117', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\164', '\130', '\040', '\164', '\151', '\040', '\061', - '\012', '\144', '\113', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\121', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\104', '\154', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\126', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\160', '\116', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\153', '\107', '\040', '\153', '\141', '\040', '\061', - '\012', '\145', '\161', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\144', '\104', '\040', '\144', '\151', '\040', '\061', - '\012', '\146', '\121', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\131', '\150', '\154', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\102', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\105', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\150', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\147', '\166', '\040', '\156', '\147', '\040', '\061', - '\012', '\114', '\163', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\146', '\112', '\040', '\144', '\145', '\040', '\061', - '\012', '\132', '\144', '\160', '\040', '\144', '\145', '\040', '\061', - '\012', '\162', '\132', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\132', '\150', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\164', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\170', '\121', '\040', '\163', '\172', '\040', '\061', - '\012', '\126', '\156', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\110', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\131', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\102', '\161', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\162', '\126', '\040', '\145', '\162', '\040', '\061', - '\012', '\131', '\143', '\163', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\122', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\151', '\127', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\126', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\132', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\103', '\161', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\146', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\162', '\102', '\166', '\040', '\145', '\162', '\040', '\061', - '\012', '\117', '\152', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\107', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\132', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\106', '\166', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\132', '\147', '\163', '\040', '\156', '\147', '\040', '\061', - '\012', '\122', '\146', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\122', '\167', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\131', '\162', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\151', '\106', '\160', '\040', '\151', '\156', '\040', '\061', - '\012', '\142', '\126', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\172', '\146', '\115', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\144', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\107', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\164', '\156', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\144', '\122', '\040', '\144', '\145', '\040', '\061', - '\012', '\147', '\102', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\172', '\103', '\040', '\156', '\147', '\040', '\061', - '\012', '\120', '\167', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\101', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\156', '\130', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\147', '\124', '\040', '\156', '\147', '\040', '\061', - '\012', '\157', '\101', '\167', '\040', '\153', '\157', '\040', '\061', - '\012', '\170', '\102', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\144', '\116', '\146', '\040', '\144', '\145', '\040', '\061', - '\012', '\120', '\161', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\116', '\160', '\144', '\040', '\144', '\151', '\040', '\061', - '\012', '\157', '\125', '\171', '\040', '\153', '\157', '\040', '\061', - '\012', '\146', '\160', '\104', '\040', '\160', '\162', '\040', '\061', - '\012', '\122', '\146', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\154', '\130', '\155', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\127', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\127', '\166', '\040', '\166', '\151', '\040', '\061', - '\012', '\106', '\167', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\114', '\161', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\166', '\121', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\147', '\102', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\112', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\127', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\130', '\166', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\104', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\144', '\120', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\126', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\120', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\144', '\167', '\101', '\040', '\144', '\145', '\040', '\061', - '\012', '\117', '\161', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\151', '\132', '\040', '\151', '\156', '\040', '\061', - '\012', '\170', '\144', '\126', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\106', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\172', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\167', '\114', '\040', '\167', '\141', '\040', '\061', - '\012', '\163', '\127', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\124', '\160', '\171', '\040', '\160', '\162', '\040', '\061', - '\012', '\167', '\142', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\165', '\120', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\113', '\156', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\151', '\165', '\117', '\040', '\151', '\156', '\040', '\061', - '\012', '\121', '\144', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\131', '\146', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\165', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\114', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\112', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\116', '\146', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\131', '\161', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\163', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\172', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\111', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\163', '\121', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\147', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\123', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\170', '\121', '\040', '\146', '\157', '\040', '\061', - '\012', '\150', '\143', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\142', '\112', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\122', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\143', '\171', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\132', '\155', '\040', '\166', '\141', '\040', '\061', - '\012', '\130', '\172', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\147', '\122', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\154', '\117', '\040', '\154', '\145', '\040', '\061', - '\012', '\164', '\103', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\155', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\132', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\142', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\104', '\147', '\161', '\040', '\156', '\147', '\040', '\061', - '\012', '\126', '\153', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\161', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\115', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\125', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\147', '\103', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\142', '\104', '\040', '\163', '\172', '\040', '\061', - '\012', '\123', '\161', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\115', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\102', '\172', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\111', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\126', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\112', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\152', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\110', '\155', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\141', '\121', '\144', '\040', '\141', '\156', '\040', '\061', - '\012', '\151', '\110', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\115', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\167', '\127', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\165', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\103', '\146', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\156', '\120', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\114', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\122', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\115', '\166', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\155', '\122', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\146', '\112', '\040', '\156', '\171', '\040', '\061', - '\012', '\170', '\103', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\163', '\121', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\165', '\103', '\040', '\165', '\156', '\040', '\061', - '\012', '\103', '\164', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\120', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\152', '\111', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\155', '\103', '\040', '\155', '\145', '\040', '\061', - '\012', '\170', '\144', '\112', '\040', '\144', '\145', '\040', '\061', - '\012', '\156', '\130', '\166', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\163', '\117', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\122', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\142', '\106', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\116', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\153', '\110', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\167', '\115', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\170', '\104', '\040', '\156', '\147', '\040', '\061', - '\012', '\121', '\150', '\151', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\161', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\156', '\114', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\113', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\151', '\161', '\116', '\040', '\151', '\156', '\040', '\061', - '\012', '\144', '\153', '\130', '\040', '\144', '\145', '\040', '\061', - '\012', '\142', '\121', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\142', '\116', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\124', '\154', '\153', '\040', '\154', '\145', '\040', '\061', - '\012', '\116', '\154', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\103', '\170', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\115', '\161', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\120', '\166', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\167', '\132', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\107', '\142', '\040', '\160', '\162', '\040', '\061', - '\012', '\156', '\162', '\106', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\153', '\123', '\040', '\153', '\141', '\040', '\061', - '\012', '\144', '\122', '\166', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\112', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\151', '\161', '\106', '\040', '\151', '\156', '\040', '\061', - '\012', '\146', '\107', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\156', '\170', '\127', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\163', '\127', '\040', '\163', '\172', '\040', '\061', - '\012', '\155', '\146', '\121', '\040', '\155', '\145', '\040', '\061', - '\012', '\146', '\147', '\120', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\154', '\110', '\040', '\154', '\145', '\040', '\061', - '\012', '\156', '\162', '\111', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\130', '\166', '\040', '\153', '\141', '\040', '\061', - '\012', '\126', '\160', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\115', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\110', '\146', '\040', '\160', '\162', '\040', '\061', - '\012', '\152', '\144', '\115', '\040', '\144', '\145', '\040', '\061', - '\012', '\142', '\161', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\103', '\153', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\113', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\172', '\107', '\040', '\163', '\172', '\040', '\061', - '\012', '\165', '\111', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\116', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\152', '\131', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\167', '\114', '\040', '\167', '\141', '\040', '\061', - '\012', '\144', '\132', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\147', '\106', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\130', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\166', '\132', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\103', '\164', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\161', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\117', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\147', '\130', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\127', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\147', '\162', '\106', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\156', '\130', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\125', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\160', '\155', '\103', '\040', '\155', '\145', '\040', '\061', - '\012', '\165', '\172', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\111', '\166', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\166', '\111', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\156', '\132', '\040', '\141', '\156', '\040', '\061', - '\012', '\154', '\170', '\132', '\040', '\154', '\145', '\040', '\061', - '\012', '\130', '\167', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\104', '\161', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\113', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\126', '\167', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\123', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\110', '\167', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\171', '\116', '\170', '\040', '\156', '\171', '\040', '\061', - '\012', '\171', '\157', '\121', '\040', '\157', '\156', '\040', '\061', - '\012', '\143', '\123', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\105', '\166', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\111', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\146', '\132', '\040', '\144', '\145', '\040', '\061', - '\012', '\150', '\172', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\102', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\153', '\161', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\102', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\154', '\112', '\152', '\040', '\154', '\145', '\040', '\061', - '\012', '\143', '\152', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\162', '\127', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\141', '\104', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\104', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\114', '\170', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\121', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\112', '\164', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\122', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\146', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\142', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\132', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\163', '\162', '\121', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\112', '\161', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\106', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\116', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\122', '\153', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\160', '\172', '\112', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\142', '\101', '\040', '\154', '\145', '\040', '\061', - '\012', '\143', '\102', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\113', '\171', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\143', '\117', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\130', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\126', '\163', '\040', '\143', '\150', '\040', '\061', - '\012', '\162', '\131', '\155', '\040', '\145', '\162', '\040', '\061', - '\012', '\153', '\126', '\155', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\143', '\132', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\172', '\103', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\113', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\120', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\143', '\114', '\040', '\143', '\150', '\040', '\061', - '\012', '\131', '\152', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\172', '\170', '\125', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\142', '\124', '\040', '\142', '\145', '\040', '\061', - '\012', '\156', '\166', '\130', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\155', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\170', '\114', '\040', '\142', '\145', '\040', '\061', - '\012', '\130', '\167', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\152', '\123', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\154', '\116', '\146', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\124', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\153', '\106', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\114', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\162', '\130', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\130', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\166', '\105', '\040', '\163', '\172', '\040', '\061', - '\012', '\110', '\167', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\106', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\147', '\122', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\104', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\117', '\161', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\126', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\164', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\167', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\146', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\120', '\143', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\160', '\117', '\040', '\160', '\162', '\040', '\061', - '\012', '\103', '\167', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\170', '\117', '\040', '\167', '\141', '\040', '\061', - '\012', '\142', '\126', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\106', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\156', '\106', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\170', '\110', '\040', '\153', '\141', '\040', '\061', - '\012', '\131', '\167', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\144', '\104', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\127', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\124', '\154', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\155', '\127', '\040', '\153', '\141', '\040', '\061', - '\012', '\155', '\150', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\172', '\124', '\040', '\163', '\172', '\040', '\061', - '\012', '\162', '\166', '\112', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\143', '\112', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\153', '\123', '\040', '\153', '\141', '\040', '\061', - '\012', '\163', '\130', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\163', '\103', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\116', '\164', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\157', '\110', '\150', '\040', '\154', '\157', '\040', '\061', - '\012', '\131', '\166', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\126', '\146', '\040', '\160', '\162', '\040', '\061', - '\012', '\153', '\105', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\146', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\127', '\155', '\040', '\157', '\156', '\040', '\061', - '\012', '\164', '\115', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\131', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\156', '\106', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\121', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\121', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\113', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\113', '\146', '\040', '\155', '\145', '\040', '\061', - '\012', '\165', '\114', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\111', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\167', '\162', '\110', '\040', '\145', '\162', '\040', '\061', - '\012', '\160', '\147', '\114', '\040', '\156', '\147', '\040', '\061', - '\012', '\114', '\142', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\152', '\106', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\106', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\144', '\130', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\124', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\112', '\167', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\154', '\170', '\125', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\152', '\101', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\120', '\147', '\040', '\151', '\156', '\040', '\061', - '\012', '\130', '\156', '\163', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\153', '\127', '\040', '\153', '\141', '\040', '\061', - '\012', '\160', '\146', '\120', '\040', '\160', '\162', '\040', '\061', - '\012', '\104', '\171', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\127', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\172', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\152', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\167', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\116', '\167', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\142', '\102', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\167', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\164', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\154', '\130', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\132', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\131', '\155', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\167', '\146', '\130', '\040', '\167', '\141', '\040', '\061', - '\012', '\126', '\161', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\161', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\125', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\152', '\172', '\124', '\040', '\152', '\157', '\040', '\061', - '\012', '\153', '\116', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\155', '\121', '\040', '\155', '\145', '\040', '\061', - '\012', '\144', '\130', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\171', '\154', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\127', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\113', '\166', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\142', '\150', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\112', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\142', '\124', '\040', '\160', '\162', '\040', '\061', - '\012', '\141', '\102', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\122', '\150', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\101', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\102', '\147', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\161', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\144', '\103', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\102', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\143', '\130', '\153', '\040', '\143', '\150', '\040', '\061', - '\012', '\156', '\155', '\115', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\122', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\110', '\153', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\150', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\171', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\153', '\107', '\155', '\040', '\153', '\141', '\040', '\061', - '\012', '\163', '\107', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\113', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\104', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\114', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\112', '\163', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\116', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\127', '\147', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\155', '\114', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\126', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\106', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\142', '\104', '\040', '\163', '\172', '\040', '\061', - '\012', '\153', '\124', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\167', '\130', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\122', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\101', '\172', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\121', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\121', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\157', '\132', '\040', '\157', '\156', '\040', '\061', - '\012', '\152', '\120', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\171', '\107', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\130', '\152', '\040', '\153', '\141', '\040', '\061', - '\012', '\171', '\102', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\156', '\167', '\120', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\156', '\101', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\113', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\161', '\142', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\107', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\152', '\107', '\040', '\151', '\152', '\040', '\061', - '\012', '\113', '\161', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\126', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\123', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\127', '\155', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\104', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\110', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\131', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\172', '\162', '\127', '\040', '\145', '\162', '\040', '\061', - '\012', '\154', '\104', '\170', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\121', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\102', '\144', '\160', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\161', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\121', '\155', '\040', '\157', '\156', '\040', '\061', - '\012', '\121', '\163', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\115', '\146', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\142', '\121', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\165', '\122', '\040', '\165', '\156', '\040', '\061', - '\012', '\143', '\115', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\161', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\130', '\146', '\040', '\144', '\145', '\040', '\061', - '\012', '\162', '\110', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\150', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\116', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\110', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\124', '\160', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\152', '\131', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\112', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\103', '\153', '\040', '\154', '\145', '\040', '\061', - '\012', '\120', '\146', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\117', '\161', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\155', '\122', '\040', '\155', '\145', '\040', '\061', - '\012', '\121', '\160', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\116', '\143', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\131', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\146', '\101', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\162', '\123', '\040', '\145', '\162', '\040', '\061', - '\012', '\107', '\160', '\146', '\040', '\160', '\162', '\040', '\061', - '\012', '\152', '\155', '\104', '\040', '\151', '\152', '\040', '\061', - '\012', '\150', '\167', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\122', '\142', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\150', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\130', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\131', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\126', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\103', '\172', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\115', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\160', '\113', '\040', '\160', '\162', '\040', '\061', - '\012', '\150', '\126', '\171', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\143', '\112', '\040', '\143', '\150', '\040', '\061', - '\012', '\117', '\153', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\112', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\114', '\160', '\040', '\151', '\152', '\040', '\061', - '\012', '\156', '\131', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\156', '\160', '\106', '\040', '\157', '\156', '\040', '\061', - '\012', '\162', '\127', '\153', '\040', '\145', '\162', '\040', '\061', - '\012', '\155', '\143', '\120', '\040', '\143', '\150', '\040', '\061', - '\012', '\156', '\132', '\155', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\131', '\142', '\040', '\146', '\157', '\040', '\061', - '\012', '\172', '\142', '\103', '\040', '\163', '\172', '\040', '\061', - '\012', '\156', '\102', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\152', '\171', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\111', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\164', '\167', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\107', '\147', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\103', '\172', '\155', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\164', '\117', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\122', '\154', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\171', '\103', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\105', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\155', '\110', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\164', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\111', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\152', '\111', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\142', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\167', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\161', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\146', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\146', '\127', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\127', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\127', '\160', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\115', '\147', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\123', '\146', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\131', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\143', '\143', '\111', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\154', '\124', '\040', '\154', '\145', '\040', '\061', - '\012', '\107', '\161', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\103', '\155', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\110', '\146', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\102', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\103', '\146', '\040', '\156', '\171', '\040', '\061', - '\012', '\161', '\172', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\144', '\106', '\040', '\144', '\145', '\040', '\061', - '\012', '\126', '\144', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\112', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\146', '\122', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\154', '\126', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\117', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\156', '\146', '\106', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\124', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\107', '\153', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\101', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\166', '\146', '\106', '\040', '\166', '\141', '\040', '\061', - '\012', '\104', '\172', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\106', '\160', '\040', '\153', '\141', '\040', '\061', - '\012', '\152', '\124', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\156', '\116', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\143', '\116', '\040', '\143', '\150', '\040', '\061', - '\012', '\112', '\152', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\164', '\113', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\162', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\155', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\115', '\161', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\146', '\122', '\040', '\146', '\157', '\040', '\061', - '\012', '\167', '\121', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\161', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\125', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\157', '\151', '\125', '\040', '\151', '\156', '\040', '\061', - '\012', '\161', '\163', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\107', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\164', '\117', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\120', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\122', '\161', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\153', '\130', '\040', '\153', '\141', '\040', '\061', - '\012', '\127', '\163', '\142', '\040', '\163', '\164', '\040', '\061', - '\012', '\143', '\170', '\122', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\132', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\171', '\121', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\151', '\125', '\040', '\151', '\156', '\040', '\061', - '\012', '\170', '\166', '\127', '\040', '\166', '\141', '\040', '\061', - '\012', '\141', '\104', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\121', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\170', '\103', '\040', '\151', '\152', '\040', '\061', - '\012', '\124', '\167', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\163', '\121', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\102', '\146', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\141', '\107', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\120', '\147', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\110', '\172', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\147', '\127', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\144', '\106', '\040', '\144', '\145', '\040', '\061', - '\012', '\153', '\142', '\131', '\040', '\153', '\141', '\040', '\061', - '\012', '\121', '\152', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\110', '\170', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\164', '\126', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\170', '\132', '\040', '\141', '\156', '\040', '\061', - '\012', '\157', '\126', '\144', '\040', '\157', '\156', '\040', '\061', - '\012', '\110', '\154', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\113', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\101', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\144', '\116', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\160', '\161', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\145', '\111', '\166', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\155', '\127', '\040', '\155', '\145', '\040', '\061', - '\012', '\171', '\143', '\113', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\121', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\150', '\155', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\154', '\106', '\040', '\141', '\156', '\040', '\061', - '\012', '\107', '\153', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\102', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\150', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\156', '\153', '\040', '\141', '\156', '\040', '\061', - '\012', '\126', '\146', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\156', '\102', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\166', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\141', '\161', '\116', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\114', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\112', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\164', '\121', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\127', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\167', '\127', '\040', '\167', '\141', '\040', '\061', - '\012', '\166', '\172', '\102', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\171', '\122', '\040', '\156', '\171', '\040', '\061', - '\012', '\161', '\161', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\171', '\111', '\040', '\156', '\171', '\040', '\061', - '\012', '\152', '\172', '\112', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\147', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\147', '\121', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\114', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\161', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\156', '\162', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\110', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\141', '\121', '\147', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\106', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\152', '\121', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\160', '\104', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\172', '\116', '\040', '\163', '\172', '\040', '\061', - '\012', '\151', '\111', '\167', '\040', '\151', '\156', '\040', '\061', - '\012', '\144', '\121', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\121', '\171', '\040', '\160', '\162', '\040', '\061', - '\012', '\130', '\171', '\170', '\040', '\156', '\171', '\040', '\061', - '\012', '\163', '\127', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\106', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\142', '\160', '\106', '\040', '\160', '\162', '\040', '\061', - '\012', '\126', '\163', '\166', '\040', '\163', '\164', '\040', '\061', - '\012', '\121', '\161', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\172', '\124', '\040', '\163', '\172', '\040', '\061', - '\012', '\163', '\161', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\113', '\172', '\155', '\040', '\163', '\172', '\040', '\061', - '\012', '\157', '\106', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\153', '\112', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\153', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\114', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\155', '\125', '\040', '\155', '\145', '\040', '\061', - '\012', '\143', '\162', '\112', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\154', '\130', '\040', '\154', '\145', '\040', '\061', - '\012', '\124', '\172', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\142', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\160', '\111', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\103', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\106', '\155', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\121', '\150', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\121', '\163', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\122', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\131', '\143', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\152', '\120', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\165', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\111', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\153', '\127', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\112', '\167', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\126', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\152', '\161', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\172', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\103', '\167', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\105', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\162', '\130', '\040', '\145', '\162', '\040', '\061', - '\012', '\113', '\161', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\154', '\131', '\166', '\040', '\154', '\145', '\040', '\061', - '\012', '\144', '\107', '\166', '\040', '\144', '\145', '\040', '\061', - '\012', '\103', '\167', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\156', '\104', '\166', '\040', '\141', '\156', '\040', '\061', - '\012', '\117', '\152', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\104', '\156', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\162', '\106', '\040', '\145', '\162', '\040', '\061', - '\012', '\112', '\155', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\172', '\146', '\111', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\161', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\166', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\156', '\120', '\160', '\040', '\141', '\156', '\040', '\061', - '\012', '\141', '\126', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\102', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\153', '\126', '\142', '\040', '\153', '\141', '\040', '\061', - '\012', '\147', '\143', '\110', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\142', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\122', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\121', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\110', '\170', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\104', '\156', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\127', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\107', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\147', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\167', '\120', '\040', '\167', '\141', '\040', '\061', - '\012', '\156', '\162', '\127', '\040', '\141', '\156', '\040', '\061', - '\012', '\151', '\126', '\161', '\040', '\144', '\151', '\040', '\061', - '\012', '\170', '\172', '\105', '\040', '\163', '\172', '\040', '\061', - '\012', '\126', '\170', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\114', '\172', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\112', '\167', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\147', '\103', '\161', '\040', '\156', '\147', '\040', '\061', - '\012', '\117', '\164', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\166', '\120', '\040', '\166', '\141', '\040', '\061', - '\012', '\143', '\116', '\162', '\040', '\143', '\150', '\040', '\061', - '\012', '\151', '\130', '\161', '\040', '\151', '\156', '\040', '\061', - '\012', '\121', '\156', '\154', '\040', '\151', '\156', '\040', '\061', - '\012', '\164', '\120', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\111', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\141', '\120', '\147', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\166', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\156', '\161', '\117', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\161', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\152', '\121', '\040', '\151', '\152', '\040', '\061', - '\012', '\154', '\167', '\121', '\040', '\154', '\145', '\040', '\061', - '\012', '\160', '\105', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\127', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\163', '\167', '\124', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\155', '\131', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\122', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\132', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\115', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\154', '\170', '\117', '\040', '\154', '\145', '\040', '\061', - '\012', '\153', '\142', '\121', '\040', '\153', '\141', '\040', '\061', - '\012', '\171', '\146', '\116', '\040', '\156', '\171', '\040', '\061', - '\012', '\171', '\155', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\160', '\113', '\040', '\151', '\152', '\040', '\061', - '\012', '\127', '\152', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\155', '\127', '\040', '\155', '\145', '\040', '\061', - '\012', '\162', '\113', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\144', '\154', '\110', '\040', '\154', '\145', '\040', '\061', - '\012', '\153', '\143', '\113', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\142', '\126', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\116', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\110', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\154', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\102', '\166', '\040', '\154', '\145', '\040', '\061', - '\012', '\157', '\141', '\106', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\146', '\115', '\040', '\146', '\157', '\040', '\061', - '\012', '\162', '\132', '\144', '\040', '\145', '\162', '\040', '\061', - '\012', '\152', '\147', '\127', '\040', '\156', '\147', '\040', '\061', - '\012', '\110', '\166', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\153', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\143', '\104', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\114', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\121', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\150', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\166', '\121', '\040', '\151', '\156', '\040', '\061', - '\012', '\125', '\153', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\160', '\126', '\040', '\160', '\162', '\040', '\061', - '\012', '\142', '\112', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\141', '\120', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\144', '\113', '\040', '\144', '\145', '\040', '\061', - '\012', '\143', '\107', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\114', '\152', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\150', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\106', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\146', '\111', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\150', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\165', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\106', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\147', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\106', '\161', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\155', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\132', '\160', '\146', '\040', '\160', '\162', '\040', '\061', - '\012', '\156', '\106', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\102', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\147', '\111', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\102', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\125', '\167', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\162', '\115', '\040', '\145', '\162', '\040', '\061', - '\012', '\171', '\102', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\122', '\154', '\146', '\040', '\154', '\145', '\040', '\061', - '\012', '\120', '\172', '\150', '\040', '\143', '\150', '\040', '\061', - '\012', '\162', '\132', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\126', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\170', '\112', '\040', '\144', '\145', '\040', '\061', - '\012', '\114', '\143', '\172', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\106', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\111', '\155', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\164', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\142', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\110', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\162', '\131', '\040', '\145', '\162', '\040', '\061', - '\012', '\164', '\102', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\113', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\116', '\153', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\103', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\171', '\130', '\040', '\142', '\145', '\040', '\061', - '\012', '\157', '\102', '\160', '\040', '\157', '\156', '\040', '\061', - '\012', '\127', '\152', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\146', '\120', '\040', '\163', '\172', '\040', '\061', - '\012', '\141', '\121', '\172', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\152', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\156', '\146', '\127', '\040', '\141', '\156', '\040', '\061', - '\012', '\156', '\130', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\112', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\141', '\123', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\151', '\122', '\146', '\040', '\151', '\156', '\040', '\061', - '\012', '\171', '\115', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\102', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\170', '\122', '\040', '\166', '\141', '\040', '\061', - '\012', '\114', '\154', '\170', '\040', '\154', '\145', '\040', '\061', - '\012', '\171', '\107', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\112', '\163', '\171', '\040', '\163', '\172', '\040', '\061', - '\012', '\114', '\166', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\145', '\106', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\142', '\115', '\040', '\167', '\141', '\040', '\061', - '\012', '\165', '\117', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\127', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\142', '\166', '\125', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\156', '\117', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\172', '\111', '\040', '\163', '\172', '\040', '\061', - '\012', '\126', '\143', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\150', '\105', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\147', '\121', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\147', '\120', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\142', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\132', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\130', '\164', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\131', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\144', '\113', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\172', '\102', '\040', '\163', '\172', '\040', '\061', - '\012', '\131', '\171', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\125', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\102', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\161', '\152', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\130', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\130', '\161', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\124', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\162', '\105', '\040', '\145', '\162', '\040', '\061', - '\012', '\163', '\116', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\132', '\150', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\126', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\107', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\112', '\161', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\124', '\155', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\150', '\105', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\121', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\124', '\155', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\170', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\172', '\105', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\115', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\103', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\167', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\126', '\172', '\040', '\141', '\156', '\040', '\061', - '\012', '\154', '\122', '\153', '\040', '\154', '\145', '\040', '\061', - '\012', '\117', '\167', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\131', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\121', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\116', '\154', '\146', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\104', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\110', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\143', '\152', '\101', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\147', '\125', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\121', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\171', '\116', '\146', '\040', '\156', '\171', '\040', '\061', - '\012', '\154', '\167', '\132', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\107', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\126', '\155', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\160', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\106', '\144', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\110', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\142', '\123', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\105', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\145', '\167', '\121', '\040', '\145', '\162', '\040', '\061', - '\012', '\145', '\127', '\144', '\040', '\145', '\162', '\040', '\061', - '\012', '\152', '\146', '\122', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\160', '\131', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\166', '\121', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\130', '\162', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\112', '\167', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\105', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\116', '\170', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\115', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\107', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\171', '\121', '\040', '\160', '\162', '\040', '\061', - '\012', '\152', '\160', '\125', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\157', '\101', '\040', '\157', '\156', '\040', '\061', - '\012', '\147', '\130', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\161', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\130', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\154', '\120', '\040', '\154', '\145', '\040', '\061', - '\012', '\114', '\172', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\170', '\102', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\112', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\143', '\124', '\040', '\143', '\150', '\040', '\061', - '\012', '\127', '\164', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\114', '\147', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\125', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\156', '\106', '\160', '\040', '\141', '\156', '\040', '\061', - '\012', '\112', '\163', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\163', '\102', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\106', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\166', '\103', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\106', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\161', '\156', '\101', '\040', '\141', '\156', '\040', '\061', - '\012', '\132', '\142', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\120', '\172', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\163', '\112', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\132', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\146', '\120', '\040', '\156', '\171', '\040', '\061', - '\012', '\147', '\131', '\166', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\146', '\103', '\040', '\142', '\145', '\040', '\061', - '\012', '\144', '\115', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\150', '\154', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\122', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\152', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\152', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\121', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\124', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\125', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\161', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\154', '\122', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\161', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\167', '\122', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\115', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\172', '\153', '\124', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\161', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\154', '\122', '\040', '\141', '\156', '\040', '\061', - '\012', '\110', '\161', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\141', '\141', '\112', '\040', '\141', '\156', '\040', '\061', - '\012', '\154', '\113', '\167', '\040', '\154', '\145', '\040', '\061', - '\012', '\142', '\172', '\102', '\040', '\163', '\172', '\040', '\061', - '\012', '\126', '\147', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\141', '\126', '\155', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\156', '\122', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\170', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\172', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\172', '\170', '\126', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\147', '\121', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\166', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\167', '\116', '\040', '\151', '\152', '\040', '\061', - '\012', '\105', '\161', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\102', '\170', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\150', '\172', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\146', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\120', '\160', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\101', '\161', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\112', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\172', '\106', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\146', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\172', '\126', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\147', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\163', '\123', '\040', '\163', '\172', '\040', '\061', - '\012', '\156', '\121', '\172', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\153', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\150', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\112', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\117', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\162', '\161', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\131', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\165', '\106', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\116', '\143', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\115', '\167', '\040', '\154', '\145', '\040', '\061', - '\012', '\143', '\152', '\111', '\040', '\143', '\150', '\040', '\061', - '\012', '\112', '\143', '\167', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\105', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\145', '\121', '\171', '\040', '\145', '\162', '\040', '\061', - '\012', '\123', '\170', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\125', '\170', '\040', '\155', '\142', '\040', '\061', - '\012', '\172', '\144', '\112', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\160', '\116', '\040', '\154', '\145', '\040', '\061', - '\012', '\122', '\153', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\166', '\111', '\040', '\166', '\141', '\040', '\061', - '\012', '\121', '\155', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\147', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\146', '\105', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\143', '\130', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\154', '\124', '\040', '\154', '\145', '\040', '\061', - '\012', '\142', '\142', '\126', '\040', '\142', '\145', '\040', '\061', - '\012', '\160', '\155', '\132', '\040', '\155', '\145', '\040', '\061', - '\012', '\165', '\161', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\131', '\171', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\155', '\131', '\040', '\155', '\145', '\040', '\061', - '\012', '\172', '\154', '\102', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\116', '\144', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\166', '\132', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\166', '\114', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\114', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\143', '\107', '\040', '\143', '\150', '\040', '\061', - '\012', '\121', '\152', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\156', '\161', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\170', '\131', '\040', '\156', '\147', '\040', '\061', - '\012', '\141', '\161', '\111', '\040', '\141', '\156', '\040', '\061', - '\012', '\113', '\161', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\130', '\161', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\166', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\161', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\110', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\110', '\143', '\040', '\141', '\156', '\040', '\061', - '\012', '\125', '\161', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\146', '\116', '\040', '\163', '\172', '\040', '\061', - '\012', '\155', '\130', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\106', '\147', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\104', '\163', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\122', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\142', '\132', '\040', '\167', '\141', '\040', '\061', - '\012', '\110', '\156', '\160', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\125', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\143', '\131', '\144', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\124', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\102', '\147', '\161', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\103', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\130', '\155', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\152', '\112', '\040', '\151', '\152', '\040', '\061', - '\012', '\164', '\144', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\150', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\106', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\153', '\121', '\040', '\144', '\145', '\040', '\061', - '\012', '\114', '\143', '\147', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\111', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\111', '\167', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\152', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\142', '\130', '\040', '\163', '\172', '\040', '\061', - '\012', '\131', '\150', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\166', '\110', '\040', '\143', '\150', '\040', '\061', - '\012', '\114', '\143', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\127', '\146', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\116', '\146', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\115', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\125', '\166', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\121', '\156', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\142', '\107', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\106', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\154', '\112', '\040', '\154', '\145', '\040', '\061', - '\012', '\142', '\120', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\170', '\160', '\111', '\040', '\160', '\162', '\040', '\061', - '\012', '\155', '\162', '\126', '\040', '\145', '\162', '\040', '\061', - '\012', '\106', '\167', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\117', '\171', '\040', '\167', '\141', '\040', '\061', - '\012', '\120', '\155', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\150', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\142', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\160', '\147', '\131', '\040', '\156', '\147', '\040', '\061', - '\012', '\122', '\142', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\101', '\167', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\155', '\143', '\102', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\153', '\107', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\153', '\127', '\040', '\153', '\141', '\040', '\061', - '\012', '\120', '\156', '\167', '\040', '\151', '\156', '\040', '\061', - '\012', '\142', '\116', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\156', '\130', '\162', '\040', '\141', '\156', '\040', '\061', - '\012', '\126', '\155', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\145', '\125', '\166', '\040', '\145', '\162', '\040', '\061', - '\012', '\171', '\121', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\153', '\170', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\113', '\163', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\160', '\127', '\040', '\160', '\162', '\040', '\061', - '\012', '\161', '\145', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\166', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\122', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\112', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\163', '\131', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\167', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\103', '\161', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\131', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\120', '\160', '\040', '\144', '\145', '\040', '\061', - '\012', '\157', '\101', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\144', '\143', '\123', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\167', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\152', '\114', '\040', '\163', '\172', '\040', '\061', - '\012', '\157', '\132', '\170', '\040', '\157', '\156', '\040', '\061', - '\012', '\153', '\152', '\122', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\104', '\171', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\123', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\145', '\121', '\146', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\102', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\114', '\142', '\040', '\155', '\145', '\040', '\061', - '\012', '\132', '\162', '\152', '\040', '\145', '\162', '\040', '\061', - '\012', '\107', '\153', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\160', '\153', '\130', '\040', '\153', '\141', '\040', '\061', - '\012', '\166', '\124', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\132', '\147', '\160', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\150', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\120', '\166', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\156', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\110', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\130', '\147', '\146', '\040', '\156', '\147', '\040', '\061', - '\012', '\103', '\167', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\154', '\142', '\116', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\116', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\116', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\112', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\157', '\112', '\144', '\040', '\157', '\156', '\040', '\061', - '\012', '\122', '\171', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\166', '\114', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\166', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\167', '\103', '\040', '\166', '\141', '\040', '\061', - '\012', '\153', '\106', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\110', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\143', '\102', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\124', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\121', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\104', '\154', '\146', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\114', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\142', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\161', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\150', '\117', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\117', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\155', '\161', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\155', '\121', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\121', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\166', '\121', '\040', '\157', '\156', '\040', '\061', - '\012', '\147', '\146', '\122', '\040', '\156', '\147', '\040', '\061', - '\012', '\120', '\155', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\124', '\143', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\161', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\167', '\126', '\040', '\155', '\145', '\040', '\061', - '\012', '\142', '\130', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\152', '\154', '\101', '\040', '\154', '\145', '\040', '\061', - '\012', '\146', '\152', '\107', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\170', '\131', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\167', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\166', '\125', '\040', '\153', '\141', '\040', '\061', - '\012', '\102', '\153', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\146', '\101', '\040', '\156', '\147', '\040', '\061', - '\012', '\101', '\167', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\126', '\155', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\121', '\150', '\154', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\155', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\115', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\110', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\120', '\142', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\154', '\113', '\040', '\154', '\145', '\040', '\061', - '\012', '\131', '\147', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\112', '\163', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\127', '\154', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\126', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\163', '\162', '\116', '\040', '\145', '\162', '\040', '\061', - '\012', '\125', '\150', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\146', '\122', '\040', '\166', '\141', '\040', '\061', - '\012', '\153', '\106', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\112', '\154', '\172', '\040', '\154', '\145', '\040', '\061', - '\012', '\146', '\113', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\122', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\127', '\167', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\166', '\117', '\040', '\163', '\172', '\040', '\061', - '\012', '\130', '\161', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\111', '\152', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\112', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\106', '\161', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\116', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\170', '\114', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\114', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\144', '\161', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\122', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\114', '\152', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\122', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\143', '\170', '\102', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\152', '\110', '\040', '\143', '\150', '\040', '\061', - '\012', '\126', '\161', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\112', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\106', '\153', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\161', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\105', '\161', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\122', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\146', '\124', '\040', '\166', '\141', '\040', '\061', - '\012', '\132', '\161', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\107', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\123', '\142', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\151', '\167', '\126', '\040', '\151', '\156', '\040', '\061', - '\012', '\152', '\146', '\111', '\040', '\151', '\152', '\040', '\061', - '\012', '\156', '\127', '\172', '\040', '\141', '\156', '\040', '\061', - '\012', '\114', '\152', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\162', '\152', '\107', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\106', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\161', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\126', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\152', '\147', '\113', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\132', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\102', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\165', '\107', '\040', '\165', '\156', '\040', '\061', - '\012', '\154', '\103', '\166', '\040', '\154', '\145', '\040', '\061', - '\012', '\154', '\170', '\127', '\040', '\154', '\145', '\040', '\061', - '\012', '\147', '\107', '\142', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\166', '\131', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\152', '\106', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\164', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\131', '\171', '\040', '\160', '\162', '\040', '\061', - '\012', '\131', '\162', '\146', '\040', '\145', '\162', '\040', '\061', - '\012', '\155', '\126', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\160', '\122', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\113', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\167', '\160', '\115', '\040', '\160', '\162', '\040', '\061', - '\012', '\143', '\114', '\153', '\040', '\143', '\150', '\040', '\061', - '\012', '\123', '\161', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\127', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\127', '\172', '\040', '\163', '\164', '\040', '\061', - '\012', '\163', '\162', '\123', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\126', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\116', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\150', '\120', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\107', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\144', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\112', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\125', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\144', '\112', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\150', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\164', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\107', '\142', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\104', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\146', '\127', '\040', '\163', '\172', '\040', '\061', - '\012', '\116', '\155', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\110', '\163', '\167', '\040', '\163', '\164', '\040', '\061', - '\012', '\160', '\146', '\107', '\040', '\160', '\162', '\040', '\061', - '\012', '\144', '\115', '\152', '\040', '\144', '\145', '\040', '\061', - '\012', '\153', '\113', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\152', '\123', '\040', '\145', '\162', '\040', '\061', - '\012', '\121', '\154', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\116', '\146', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\143', '\161', '\115', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\127', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\165', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\146', '\106', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\147', '\110', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\160', '\132', '\040', '\160', '\162', '\040', '\061', - '\012', '\142', '\164', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\161', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\171', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\162', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\171', '\164', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\110', '\155', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\102', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\171', '\116', '\040', '\156', '\171', '\040', '\061', - '\012', '\121', '\162', '\152', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\113', '\144', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\146', '\125', '\040', '\142', '\145', '\040', '\061', - '\012', '\121', '\146', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\161', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\117', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\150', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\161', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\152', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\131', '\146', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\141', '\130', '\153', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\142', '\126', '\040', '\160', '\162', '\040', '\061', - '\012', '\166', '\152', '\120', '\040', '\151', '\152', '\040', '\061', - '\012', '\131', '\142', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\112', '\155', '\142', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\106', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\120', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\127', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\166', '\150', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\167', '\124', '\040', '\151', '\156', '\040', '\061', - '\012', '\161', '\132', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\161', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\106', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\160', '\127', '\040', '\143', '\150', '\040', '\061', - '\012', '\114', '\160', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\146', '\114', '\040', '\153', '\141', '\040', '\061', - '\012', '\160', '\121', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\167', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\160', '\115', '\040', '\151', '\152', '\040', '\061', - '\012', '\121', '\153', '\155', '\040', '\153', '\141', '\040', '\061', - '\012', '\152', '\147', '\110', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\152', '\120', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\147', '\114', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\114', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\144', '\170', '\116', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\127', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\112', '\152', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\150', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\131', '\166', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\162', '\105', '\040', '\145', '\162', '\040', '\061', - '\012', '\142', '\132', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\114', '\166', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\145', '\116', '\167', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\152', '\102', '\040', '\151', '\152', '\040', '\061', - '\012', '\144', '\143', '\121', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\132', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\167', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\120', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\115', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\150', '\146', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\172', '\121', '\040', '\163', '\172', '\040', '\061', - '\012', '\125', '\165', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\107', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\103', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\156', '\160', '\103', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\127', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\152', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\120', '\172', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\167', '\165', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\150', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\115', '\161', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\163', '\111', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\144', '\125', '\040', '\144', '\145', '\040', '\061', - '\012', '\130', '\162', '\155', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\121', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\153', '\127', '\040', '\153', '\141', '\040', '\061', - '\012', '\144', '\110', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\162', '\143', '\102', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\127', '\165', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\111', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\162', '\131', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\130', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\161', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\155', '\116', '\040', '\155', '\145', '\040', '\061', - '\012', '\163', '\112', '\146', '\040', '\163', '\164', '\040', '\061', - '\012', '\171', '\115', '\146', '\040', '\156', '\171', '\040', '\061', - '\012', '\123', '\146', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\172', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\166', '\124', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\155', '\130', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\161', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\156', '\107', '\040', '\141', '\156', '\040', '\061', - '\012', '\112', '\160', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\146', '\162', '\130', '\040', '\145', '\162', '\040', '\061', - '\012', '\171', '\114', '\146', '\040', '\156', '\171', '\040', '\061', - '\012', '\165', '\171', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\104', '\144', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\124', '\147', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\145', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\105', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\103', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\155', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\152', '\110', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\115', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\131', '\167', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\172', '\147', '\104', '\040', '\156', '\147', '\040', '\061', - '\012', '\120', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\161', '\115', '\040', '\157', '\156', '\040', '\061', - '\012', '\167', '\144', '\130', '\040', '\144', '\145', '\040', '\061', - '\012', '\102', '\160', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\150', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\105', '\160', '\142', '\040', '\160', '\162', '\040', '\061', - '\012', '\142', '\150', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\166', '\121', '\040', '\153', '\141', '\040', '\061', - '\012', '\122', '\163', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\142', '\120', '\040', '\142', '\145', '\040', '\061', - '\012', '\156', '\115', '\155', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\165', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\152', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\170', '\130', '\040', '\146', '\157', '\040', '\061', - '\012', '\150', '\166', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\120', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\155', '\171', '\040', '\155', '\145', '\040', '\061', - '\012', '\121', '\172', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\116', '\163', '\172', '\040', '\163', '\164', '\040', '\061', - '\012', '\166', '\127', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\150', '\146', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\103', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\121', '\170', '\040', '\156', '\171', '\040', '\061', - '\012', '\167', '\150', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\162', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\147', '\127', '\040', '\156', '\147', '\040', '\061', - '\012', '\112', '\150', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\150', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\120', '\167', '\146', '\040', '\157', '\167', '\040', '\061', - '\012', '\154', '\152', '\103', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\166', '\102', '\040', '\166', '\141', '\040', '\061', - '\012', '\155', '\143', '\116', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\110', '\170', '\040', '\156', '\171', '\040', '\061', - '\012', '\142', '\102', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\122', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\154', '\110', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\132', '\160', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\112', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\123', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\126', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\165', '\127', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\170', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\146', '\152', '\115', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\150', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\103', '\152', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\132', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\142', '\103', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\162', '\167', '\131', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\105', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\144', '\125', '\166', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\122', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\107', '\143', '\165', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\104', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\144', '\152', '\110', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\154', '\125', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\171', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\146', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\130', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\154', '\142', '\103', '\040', '\154', '\145', '\040', '\061', - '\012', '\120', '\167', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\117', '\141', '\145', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\142', '\103', '\040', '\160', '\162', '\040', '\061', - '\012', '\144', '\127', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\172', '\125', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\112', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\131', '\152', '\040', '\144', '\145', '\040', '\061', - '\012', '\143', '\102', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\122', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\144', '\152', '\107', '\040', '\144', '\145', '\040', '\061', - '\012', '\155', '\131', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\121', '\142', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\156', '\130', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\120', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\167', '\166', '\116', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\107', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\116', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\122', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\125', '\161', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\170', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\146', '\172', '\130', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\152', '\115', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\161', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\115', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\155', '\114', '\040', '\155', '\145', '\040', '\061', - '\012', '\105', '\171', '\170', '\040', '\156', '\171', '\040', '\061', - '\012', '\150', '\110', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\107', '\160', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\146', '\104', '\040', '\155', '\145', '\040', '\061', - '\012', '\112', '\146', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\127', '\152', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\132', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\111', '\171', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\122', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\144', '\125', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\112', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\152', '\171', '\040', '\151', '\152', '\040', '\061', - '\012', '\121', '\141', '\157', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\130', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\123', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\101', '\157', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\114', '\163', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\103', '\163', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\153', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\170', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\144', '\116', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\131', '\170', '\040', '\156', '\171', '\040', '\061', - '\012', '\144', '\153', '\116', '\040', '\144', '\145', '\040', '\061', - '\012', '\122', '\147', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\147', '\114', '\040', '\163', '\172', '\040', '\061', - '\012', '\122', '\143', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\151', '\127', '\172', '\040', '\151', '\156', '\040', '\061', - '\012', '\144', '\114', '\153', '\040', '\144', '\145', '\040', '\061', - '\012', '\155', '\160', '\130', '\040', '\155', '\145', '\040', '\061', - '\012', '\107', '\142', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\142', '\156', '\110', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\144', '\115', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\161', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\115', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\167', '\110', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\147', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\114', '\152', '\153', '\040', '\151', '\152', '\040', '\061', - '\012', '\164', '\154', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\147', '\105', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\143', '\167', '\040', '\143', '\150', '\040', '\061', - '\012', '\126', '\142', '\171', '\040', '\142', '\145', '\040', '\061', - '\012', '\155', '\126', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\110', '\147', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\161', '\120', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\150', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\106', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\102', '\146', '\040', '\156', '\171', '\040', '\061', - '\012', '\127', '\155', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\166', '\116', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\115', '\156', '\166', '\040', '\141', '\156', '\040', '\061', - '\012', '\132', '\155', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\172', '\123', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\146', '\103', '\040', '\156', '\171', '\040', '\061', - '\012', '\105', '\160', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\154', '\152', '\107', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\125', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\121', '\147', '\157', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\161', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\153', '\155', '\040', '\153', '\141', '\040', '\061', - '\012', '\127', '\166', '\171', '\040', '\166', '\141', '\040', '\061', - '\012', '\102', '\152', '\160', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\146', '\132', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\170', '\124', '\040', '\167', '\141', '\040', '\061', - '\012', '\126', '\170', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\144', '\122', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\126', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\151', '\127', '\146', '\040', '\151', '\156', '\040', '\061', - '\012', '\123', '\155', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\167', '\107', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\143', '\127', '\040', '\143', '\150', '\040', '\061', - '\012', '\121', '\147', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\127', '\153', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\162', '\114', '\040', '\145', '\162', '\040', '\061', - '\012', '\164', '\126', '\150', '\040', '\143', '\150', '\040', '\061', - '\012', '\132', '\154', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\172', '\104', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\170', '\120', '\040', '\156', '\171', '\040', '\061', - '\012', '\131', '\171', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\172', '\120', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\102', '\147', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\117', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\157', '\130', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\121', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\170', '\106', '\040', '\146', '\157', '\040', '\061', - '\012', '\144', '\117', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\164', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\150', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\150', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\107', '\161', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\106', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\145', '\103', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\152', '\110', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\161', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\160', '\114', '\040', '\151', '\152', '\040', '\061', - '\012', '\150', '\147', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\106', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\121', '\152', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\113', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\172', '\121', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\116', '\150', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\113', '\161', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\167', '\117', '\040', '\164', '\150', '\040', '\061', - '\012', '\157', '\131', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\127', '\156', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\123', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\101', '\146', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\161', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\105', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\113', '\160', '\040', '\144', '\145', '\040', '\061', - '\012', '\156', '\155', '\113', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\130', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\166', '\152', '\103', '\040', '\151', '\152', '\040', '\061', - '\012', '\144', '\130', '\142', '\040', '\144', '\145', '\040', '\061', - '\012', '\164', '\121', '\156', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\157', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\122', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\171', '\171', '\114', '\040', '\156', '\171', '\040', '\061', - '\012', '\153', '\123', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\130', '\171', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\155', '\101', '\040', '\166', '\141', '\040', '\061', - '\012', '\132', '\147', '\155', '\040', '\156', '\147', '\040', '\061', - '\012', '\114', '\142', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\142', '\111', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\132', '\144', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\110', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\131', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\115', '\161', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\115', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\163', '\166', '\040', '\163', '\164', '\040', '\061', - '\012', '\172', '\130', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\121', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\143', '\126', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\146', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\115', '\150', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\102', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\127', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\127', '\172', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\127', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\116', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\170', '\142', '\132', '\040', '\142', '\145', '\040', '\061', - '\012', '\155', '\124', '\142', '\040', '\155', '\145', '\040', '\061', - '\012', '\113', '\144', '\146', '\040', '\144', '\145', '\040', '\061', - '\012', '\160', '\146', '\121', '\040', '\160', '\162', '\040', '\061', - '\012', '\166', '\103', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\120', '\161', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\146', '\132', '\040', '\157', '\156', '\040', '\061', - '\012', '\167', '\131', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\124', '\146', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\107', '\156', '\142', '\040', '\141', '\156', '\040', '\061', - '\012', '\132', '\144', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\126', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\124', '\161', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\172', '\126', '\040', '\163', '\172', '\040', '\061', - '\012', '\111', '\147', '\161', '\040', '\156', '\147', '\040', '\061', - '\012', '\121', '\166', '\166', '\040', '\166', '\151', '\040', '\061', - '\012', '\120', '\155', '\146', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\110', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\142', '\122', '\040', '\142', '\145', '\040', '\061', - '\012', '\143', '\106', '\147', '\040', '\143', '\150', '\040', '\061', - '\012', '\113', '\166', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\132', '\170', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\157', '\126', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\131', '\150', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\167', '\120', '\040', '\167', '\141', '\040', '\061', - '\012', '\126', '\166', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\163', '\144', '\127', '\040', '\144', '\145', '\040', '\061', - '\012', '\147', '\106', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\122', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\142', '\161', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\150', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\102', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\142', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\112', '\172', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\162', '\123', '\040', '\145', '\162', '\040', '\061', - '\012', '\155', '\153', '\132', '\040', '\155', '\145', '\040', '\061', - '\012', '\142', '\113', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\152', '\120', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\130', '\161', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\107', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\114', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\156', '\162', '\126', '\040', '\141', '\156', '\040', '\061', - '\012', '\124', '\155', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\172', '\166', '\132', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\127', '\154', '\040', '\156', '\147', '\040', '\061', - '\012', '\131', '\170', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\171', '\127', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\161', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\127', '\165', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\132', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\161', '\111', '\040', '\151', '\156', '\040', '\061', - '\012', '\143', '\160', '\121', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\120', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\161', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\155', '\111', '\040', '\156', '\147', '\040', '\061', - '\012', '\127', '\153', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\132', '\166', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\144', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\131', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\102', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\104', '\167', '\142', '\040', '\157', '\167', '\040', '\061', - '\012', '\127', '\172', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\144', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\166', '\122', '\040', '\163', '\172', '\040', '\061', - '\012', '\116', '\166', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\122', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\104', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\107', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\167', '\124', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\124', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\103', '\166', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\154', '\121', '\040', '\154', '\145', '\040', '\061', - '\012', '\155', '\127', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\167', '\123', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\160', '\115', '\040', '\141', '\156', '\040', '\061', - '\012', '\125', '\146', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\165', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\103', '\152', '\040', '\157', '\156', '\040', '\061', - '\012', '\164', '\170', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\131', '\146', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\167', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\144', '\172', '\040', '\144', '\145', '\040', '\061', - '\012', '\126', '\147', '\161', '\040', '\156', '\147', '\040', '\061', - '\012', '\122', '\153', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\120', '\170', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\155', '\103', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\150', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\147', '\102', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\166', '\127', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\144', '\114', '\040', '\144', '\145', '\040', '\061', - '\012', '\114', '\170', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\163', '\166', '\102', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\165', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\106', '\171', '\040', '\156', '\147', '\040', '\061', - '\012', '\157', '\126', '\166', '\040', '\157', '\156', '\040', '\061', - '\012', '\132', '\150', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\157', '\161', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\112', '\160', '\040', '\157', '\156', '\040', '\061', - '\012', '\147', '\111', '\146', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\167', '\106', '\040', '\167', '\141', '\040', '\061', - '\012', '\166', '\114', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\147', '\130', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\113', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\170', '\122', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\167', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\116', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\107', '\166', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\121', '\146', '\040', '\160', '\162', '\040', '\061', - '\012', '\170', '\142', '\126', '\040', '\142', '\145', '\040', '\061', - '\012', '\144', '\160', '\132', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\110', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\102', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\125', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\172', '\101', '\040', '\164', '\150', '\040', '\061', - '\012', '\115', '\156', '\172', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\102', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\157', '\141', '\105', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\154', '\113', '\040', '\154', '\145', '\040', '\061', - '\012', '\127', '\154', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\150', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\166', '\130', '\040', '\166', '\141', '\040', '\061', - '\012', '\106', '\146', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\147', '\130', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\127', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\107', '\160', '\171', '\040', '\160', '\162', '\040', '\061', - '\012', '\170', '\155', '\123', '\040', '\155', '\145', '\040', '\061', - '\012', '\147', '\132', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\152', '\130', '\040', '\144', '\145', '\040', '\061', - '\012', '\142', '\153', '\130', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\154', '\120', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\103', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\131', '\150', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\167', '\121', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\154', '\104', '\040', '\154', '\145', '\040', '\061', - '\012', '\122', '\150', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\141', '\105', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\160', '\131', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\126', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\156', '\112', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\144', '\126', '\040', '\144', '\145', '\040', '\061', - '\012', '\122', '\166', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\117', '\161', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\160', '\124', '\040', '\163', '\172', '\040', '\061', - '\012', '\120', '\172', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\124', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\146', '\161', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\164', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\161', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\132', '\142', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\110', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\121', '\143', '\162', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\126', '\155', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\116', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\130', '\150', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\157', '\131', '\171', '\040', '\157', '\156', '\040', '\061', - '\012', '\106', '\154', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\167', '\152', '\040', '\154', '\145', '\040', '\061', - '\012', '\162', '\167', '\110', '\040', '\145', '\162', '\040', '\061', - '\012', '\157', '\127', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\102', '\167', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\152', '\130', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\114', '\153', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\126', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\130', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\153', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\162', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\161', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\170', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\147', '\132', '\040', '\156', '\147', '\040', '\061', - '\012', '\106', '\147', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\167', '\115', '\040', '\141', '\156', '\040', '\061', - '\012', '\127', '\172', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\147', '\142', '\040', '\156', '\147', '\040', '\061', - '\012', '\131', '\147', '\166', '\040', '\156', '\147', '\040', '\061', - '\012', '\130', '\144', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\152', '\115', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\110', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\113', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\166', '\115', '\040', '\144', '\145', '\040', '\061', - '\012', '\132', '\160', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\167', '\120', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\151', '\101', '\040', '\151', '\156', '\040', '\061', - '\012', '\152', '\171', '\126', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\171', '\122', '\040', '\151', '\152', '\040', '\061', - '\012', '\125', '\157', '\170', '\040', '\157', '\156', '\040', '\061', - '\012', '\121', '\153', '\172', '\040', '\153', '\141', '\040', '\061', - '\012', '\114', '\170', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\160', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\155', '\146', '\040', '\155', '\145', '\040', '\061', - '\012', '\153', '\122', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\152', '\106', '\153', '\040', '\151', '\152', '\040', '\061', - '\012', '\156', '\132', '\143', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\103', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\142', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\172', '\154', '\106', '\040', '\154', '\145', '\040', '\061', - '\012', '\153', '\161', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\127', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\113', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\160', '\146', '\040', '\160', '\162', '\040', '\061', - '\012', '\154', '\142', '\122', '\040', '\154', '\145', '\040', '\061', - '\012', '\162', '\142', '\112', '\040', '\145', '\162', '\040', '\061', - '\012', '\172', '\146', '\113', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\126', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\132', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\172', '\156', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\132', '\142', '\040', '\147', '\141', '\040', '\061', - '\012', '\167', '\164', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\166', '\127', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\150', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\162', '\126', '\040', '\145', '\162', '\040', '\061', - '\012', '\160', '\131', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\121', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\160', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\106', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\172', '\144', '\117', '\040', '\144', '\145', '\040', '\061', - '\012', '\112', '\166', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\121', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\127', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\104', '\164', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\113', '\172', '\040', '\154', '\145', '\040', '\061', - '\012', '\144', '\153', '\111', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\123', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\171', '\103', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\167', '\150', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\126', '\155', '\040', '\154', '\145', '\040', '\061', - '\012', '\171', '\110', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\120', '\154', '\155', '\040', '\154', '\145', '\040', '\061', - '\012', '\112', '\160', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\150', '\105', '\167', '\040', '\150', '\141', '\040', '\061', - '\012', '\172', '\110', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\165', '\111', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\172', '\102', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\163', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\142', '\130', '\040', '\160', '\162', '\040', '\061', - '\012', '\152', '\171', '\131', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\104', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\124', '\161', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\124', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\142', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\103', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\143', '\127', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\150', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\167', '\122', '\040', '\167', '\141', '\040', '\061', - '\012', '\144', '\121', '\155', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\103', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\171', '\150', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\154', '\121', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\126', '\142', '\040', '\156', '\147', '\040', '\061', - '\012', '\120', '\144', '\171', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\117', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\132', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\157', '\161', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\161', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\153', '\130', '\040', '\151', '\152', '\040', '\061', - '\012', '\113', '\146', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\160', '\121', '\040', '\160', '\162', '\040', '\061', - '\012', '\162', '\150', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\152', '\111', '\040', '\151', '\152', '\040', '\061', - '\012', '\102', '\161', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\141', '\103', '\160', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\143', '\130', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\107', '\155', '\040', '\155', '\141', '\040', '\061', - '\012', '\160', '\141', '\125', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\125', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\114', '\144', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\146', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\167', '\110', '\040', '\167', '\141', '\040', '\061', - '\012', '\120', '\156', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\170', '\126', '\040', '\153', '\141', '\040', '\061', - '\012', '\116', '\142', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\163', '\161', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\103', '\152', '\160', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\143', '\132', '\040', '\153', '\141', '\040', '\061', - '\012', '\127', '\161', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\164', '\172', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\161', '\130', '\040', '\141', '\156', '\040', '\061', - '\012', '\131', '\171', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\114', '\172', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\132', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\163', '\144', '\131', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\130', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\116', '\142', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\167', '\114', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\116', '\161', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\167', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\171', '\166', '\110', '\040', '\166', '\141', '\040', '\061', - '\012', '\171', '\154', '\103', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\171', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\156', '\172', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\110', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\125', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\147', '\111', '\040', '\156', '\147', '\040', '\061', - '\012', '\132', '\164', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\166', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\164', '\107', '\156', '\040', '\164', '\150', '\040', '\061', - '\012', '\125', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\110', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\127', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\130', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\106', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\144', '\124', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\110', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\103', '\152', '\040', '\154', '\145', '\040', '\061', - '\012', '\155', '\126', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\121', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\127', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\171', '\106', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\152', '\131', '\040', '\144', '\145', '\040', '\061', - '\012', '\142', '\164', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\154', '\115', '\040', '\154', '\145', '\040', '\061', - '\012', '\111', '\167', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\120', '\144', '\142', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\164', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\152', '\122', '\040', '\151', '\152', '\040', '\061', - '\012', '\144', '\150', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\130', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\142', '\105', '\040', '\142', '\145', '\040', '\061', - '\012', '\110', '\161', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\114', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\142', '\104', '\040', '\153', '\141', '\040', '\061', - '\012', '\166', '\125', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\132', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\121', '\153', '\145', '\040', '\154', '\145', '\040', '\061', - '\012', '\146', '\150', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\145', '\110', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\110', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\124', '\146', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\165', '\157', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\103', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\114', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\144', '\127', '\040', '\144', '\145', '\040', '\061', - '\012', '\103', '\147', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\114', '\162', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\117', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\161', '\117', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\161', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\164', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\167', '\125', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\131', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\172', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\156', '\127', '\166', '\040', '\141', '\156', '\040', '\061', - '\012', '\154', '\116', '\170', '\040', '\154', '\145', '\040', '\061', - '\012', '\127', '\161', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\143', '\104', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\146', '\104', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\126', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\172', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\146', '\110', '\040', '\151', '\152', '\040', '\061', - '\012', '\122', '\162', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\104', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\117', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\167', '\132', '\040', '\167', '\141', '\040', '\061', - '\012', '\155', '\121', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\156', '\161', '\113', '\040', '\141', '\156', '\040', '\061', - '\012', '\125', '\166', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\153', '\122', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\150', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\163', '\104', '\040', '\163', '\164', '\040', '\061', - '\012', '\114', '\144', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\121', '\166', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\115', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\142', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\152', '\130', '\040', '\143', '\150', '\040', '\061', - '\012', '\156', '\142', '\124', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\116', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\167', '\103', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\156', '\130', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\132', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\103', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\110', '\153', '\040', '\144', '\145', '\040', '\061', - '\012', '\103', '\143', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\115', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\166', '\107', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\120', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\111', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\154', '\110', '\170', '\040', '\154', '\145', '\040', '\061', - '\012', '\146', '\156', '\102', '\040', '\141', '\156', '\040', '\061', - '\012', '\105', '\142', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\162', '\107', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\147', '\104', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\112', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\143', '\107', '\040', '\143', '\150', '\040', '\061', - '\012', '\131', '\142', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\157', '\104', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\122', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\112', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\164', '\106', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\107', '\144', '\166', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\110', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\125', '\161', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\131', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\110', '\160', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\150', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\132', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\121', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\167', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\172', '\125', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\121', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\142', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\126', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\112', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\162', '\146', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\115', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\112', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\104', '\161', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\115', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\172', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\127', '\144', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\124', '\144', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\155', '\143', '\124', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\117', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\113', '\147', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\162', '\124', '\040', '\145', '\162', '\040', '\061', - '\012', '\142', '\161', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\156', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\114', '\172', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\114', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\114', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\172', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\121', '\162', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\145', '\106', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\116', '\155', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\160', '\170', '\105', '\040', '\160', '\162', '\040', '\061', - '\012', '\103', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\143', '\144', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\130', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\146', '\142', '\125', '\040', '\142', '\145', '\040', '\061', - '\012', '\141', '\145', '\117', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\166', '\126', '\040', '\163', '\164', '\040', '\061', - '\012', '\171', '\126', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\122', '\160', '\040', '\163', '\164', '\040', '\061', - '\012', '\162', '\170', '\125', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\150', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\121', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\130', '\167', '\040', '\157', '\156', '\040', '\061', - '\012', '\112', '\166', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\153', '\166', '\110', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\126', '\171', '\040', '\163', '\172', '\040', '\061', - '\012', '\162', '\117', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\127', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\151', '\130', '\166', '\040', '\151', '\156', '\040', '\061', - '\012', '\143', '\102', '\153', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\153', '\115', '\040', '\153', '\141', '\040', '\061', - '\012', '\166', '\110', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\142', '\127', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\131', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\156', '\110', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\122', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\166', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\157', '\115', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\161', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\102', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\157', '\120', '\152', '\040', '\157', '\156', '\040', '\061', - '\012', '\146', '\106', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\126', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\164', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\116', '\164', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\167', '\114', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\106', '\172', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\126', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\107', '\142', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\157', '\112', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\153', '\114', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\157', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\170', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\162', '\132', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\103', '\147', '\144', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\166', '\127', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\131', '\166', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\152', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\156', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\112', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\127', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\142', '\130', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\126', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\165', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\110', '\172', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\165', '\104', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\167', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\112', '\153', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\107', '\144', '\155', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\143', '\117', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\154', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\146', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\143', '\114', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\172', '\107', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\150', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\146', '\104', '\040', '\153', '\141', '\040', '\061', - '\012', '\153', '\142', '\112', '\040', '\153', '\141', '\040', '\061', - '\012', '\116', '\161', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\131', '\161', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\164', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\143', '\104', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\147', '\131', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\144', '\124', '\040', '\144', '\141', '\040', '\061', - '\012', '\166', '\124', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\143', '\116', '\172', '\040', '\143', '\150', '\040', '\061', - '\012', '\112', '\142', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\143', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\162', '\125', '\167', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\130', '\166', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\122', '\146', '\040', '\144', '\145', '\040', '\061', - '\012', '\142', '\112', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\141', '\161', '\101', '\040', '\141', '\156', '\040', '\061', - '\012', '\165', '\117', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\120', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\165', '\104', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\161', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\130', '\162', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\162', '\114', '\040', '\145', '\162', '\040', '\061', - '\012', '\156', '\112', '\153', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\163', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\161', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\145', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\114', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\105', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\160', '\155', '\105', '\040', '\155', '\145', '\040', '\061', - '\012', '\152', '\111', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\172', '\132', '\040', '\163', '\172', '\040', '\061', - '\012', '\121', '\150', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\156', '\116', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\120', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\132', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\151', '\167', '\122', '\040', '\151', '\156', '\040', '\061', - '\012', '\157', '\112', '\166', '\040', '\153', '\157', '\040', '\061', - '\012', '\165', '\146', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\113', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\165', '\127', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\103', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\167', '\102', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\125', '\171', '\146', '\040', '\156', '\171', '\040', '\061', - '\012', '\165', '\126', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\113', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\155', '\162', '\132', '\040', '\145', '\162', '\040', '\061', - '\012', '\154', '\130', '\142', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\112', '\155', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\131', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\110', '\153', '\167', '\040', '\153', '\141', '\040', '\061', - '\012', '\105', '\167', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\112', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\105', '\155', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\143', '\161', '\114', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\126', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\120', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\172', '\143', '\103', '\040', '\143', '\150', '\040', '\061', - '\012', '\116', '\144', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\127', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\143', '\115', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\153', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\150', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\141', '\120', '\040', '\141', '\156', '\040', '\061', - '\012', '\162', '\126', '\163', '\040', '\145', '\162', '\040', '\061', - '\012', '\144', '\114', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\123', '\147', '\155', '\040', '\156', '\147', '\040', '\061', - '\012', '\130', '\150', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\161', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\113', '\161', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\122', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\127', '\144', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\143', '\121', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\142', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\164', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\167', '\102', '\040', '\143', '\150', '\040', '\061', - '\012', '\156', '\146', '\126', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\147', '\120', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\167', '\127', '\040', '\160', '\162', '\040', '\061', - '\012', '\160', '\161', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\153', '\160', '\040', '\153', '\141', '\040', '\061', - '\012', '\151', '\172', '\112', '\040', '\151', '\156', '\040', '\061', - '\012', '\143', '\131', '\167', '\040', '\143', '\150', '\040', '\061', - '\012', '\151', '\121', '\154', '\040', '\151', '\156', '\040', '\061', - '\012', '\121', '\166', '\171', '\040', '\166', '\141', '\040', '\061', - '\012', '\171', '\154', '\122', '\040', '\154', '\145', '\040', '\061', - '\012', '\163', '\106', '\160', '\040', '\163', '\164', '\040', '\061', - '\012', '\114', '\161', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\156', '\120', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\131', '\154', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\111', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\161', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\160', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\130', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\162', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\163', '\152', '\111', '\040', '\163', '\164', '\040', '\061', - '\012', '\151', '\171', '\130', '\040', '\151', '\156', '\040', '\061', - '\012', '\132', '\146', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\164', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\132', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\130', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\112', '\167', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\142', '\120', '\040', '\156', '\147', '\040', '\061', - '\012', '\121', '\165', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\122', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\130', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\126', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\107', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\116', '\170', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\171', '\113', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\101', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\157', '\125', '\170', '\040', '\157', '\156', '\040', '\061', - '\012', '\156', '\127', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\167', '\125', '\040', '\167', '\141', '\040', '\061', - '\012', '\155', '\113', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\150', '\117', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\107', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\127', '\167', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\156', '\105', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\152', '\123', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\171', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\127', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\121', '\144', '\152', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\123', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\111', '\157', '\171', '\040', '\157', '\156', '\040', '\061', - '\012', '\130', '\160', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\170', '\112', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\170', '\166', '\124', '\040', '\166', '\141', '\040', '\061', - '\012', '\143', '\144', '\124', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\150', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\126', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\152', '\124', '\040', '\143', '\150', '\040', '\061', - '\012', '\110', '\161', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\142', '\120', '\040', '\141', '\156', '\040', '\061', - '\012', '\125', '\167', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\113', '\143', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\163', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\153', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\162', '\130', '\040', '\145', '\162', '\040', '\061', - '\012', '\172', '\142', '\116', '\040', '\163', '\172', '\040', '\061', - '\012', '\155', '\131', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\147', '\114', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\107', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\120', '\142', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\143', '\126', '\040', '\143', '\150', '\040', '\061', - '\012', '\121', '\152', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\166', '\102', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\113', '\160', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\132', '\171', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\150', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\103', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\114', '\162', '\153', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\122', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\143', '\115', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\157', '\150', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\162', '\113', '\040', '\145', '\162', '\040', '\061', - '\012', '\144', '\121', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\110', '\144', '\152', '\040', '\144', '\145', '\040', '\061', - '\012', '\102', '\153', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\171', '\130', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\144', '\117', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\127', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\130', '\164', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\125', '\170', '\040', '\141', '\162', '\040', '\061', - '\012', '\161', '\110', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\121', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\172', '\125', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\124', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\153', '\116', '\040', '\163', '\172', '\040', '\061', - '\012', '\106', '\161', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\112', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\153', '\121', '\040', '\153', '\141', '\040', '\061', - '\012', '\167', '\170', '\106', '\040', '\167', '\141', '\040', '\061', - '\012', '\166', '\122', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\172', '\104', '\040', '\163', '\172', '\040', '\061', - '\012', '\132', '\161', '\165', '\040', '\165', '\156', '\040', '\061', - '\012', '\172', '\127', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\147', '\125', '\040', '\156', '\147', '\040', '\061', - '\012', '\165', '\147', '\130', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\155', '\102', '\040', '\155', '\145', '\040', '\061', - '\012', '\147', '\172', '\101', '\040', '\156', '\147', '\040', '\061', - '\012', '\132', '\152', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\111', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\157', '\113', '\040', '\157', '\156', '\040', '\061', - '\012', '\107', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\114', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\107', '\167', '\040', '\154', '\145', '\040', '\061', - '\012', '\164', '\132', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\143', '\116', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\120', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\162', '\161', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\167', '\107', '\040', '\160', '\162', '\040', '\061', - '\012', '\166', '\146', '\120', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\111', '\171', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\105', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\161', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\110', '\170', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\114', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\160', '\171', '\040', '\160', '\162', '\040', '\061', - '\012', '\160', '\122', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\146', '\132', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\126', '\166', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\153', '\102', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\107', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\153', '\166', '\132', '\040', '\153', '\141', '\040', '\061', - '\012', '\143', '\161', '\127', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\114', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\131', '\160', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\162', '\122', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\167', '\132', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\126', '\144', '\040', '\156', '\147', '\040', '\061', - '\012', '\151', '\103', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\106', '\170', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\171', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\147', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\114', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\160', '\130', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\116', '\166', '\040', '\156', '\147', '\040', '\061', - '\012', '\110', '\147', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\112', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\110', '\166', '\155', '\040', '\166', '\141', '\040', '\061', - '\012', '\165', '\130', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\114', '\172', '\040', '\154', '\145', '\040', '\061', - '\012', '\144', '\167', '\120', '\040', '\144', '\145', '\040', '\061', - '\012', '\147', '\166', '\116', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\160', '\106', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\132', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\120', '\146', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\143', '\111', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\126', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\146', '\144', '\103', '\040', '\144', '\145', '\040', '\061', - '\012', '\160', '\142', '\105', '\040', '\160', '\162', '\040', '\061', - '\012', '\152', '\121', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\124', '\161', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\115', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\107', '\153', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\144', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\111', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\150', '\110', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\114', '\163', '\142', '\040', '\163', '\164', '\040', '\061', - '\012', '\127', '\166', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\121', '\143', '\167', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\146', '\121', '\040', '\156', '\147', '\040', '\061', - '\012', '\106', '\152', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\102', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\114', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\172', '\153', '\122', '\040', '\163', '\172', '\040', '\061', - '\012', '\153', '\152', '\101', '\040', '\151', '\152', '\040', '\061', - '\012', '\106', '\143', '\167', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\150', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\151', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\121', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\130', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\114', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\112', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\163', '\117', '\152', '\040', '\163', '\164', '\040', '\061', - '\012', '\166', '\127', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\101', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\113', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\151', '\111', '\171', '\040', '\151', '\156', '\040', '\061', - '\012', '\160', '\112', '\171', '\040', '\160', '\162', '\040', '\061', - '\012', '\114', '\161', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\102', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\153', '\122', '\142', '\040', '\153', '\141', '\040', '\061', - '\012', '\114', '\143', '\160', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\146', '\102', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\126', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\127', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\171', '\146', '\040', '\156', '\171', '\040', '\061', - '\012', '\160', '\165', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\111', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\107', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\152', '\152', '\114', '\040', '\151', '\152', '\040', '\061', - '\012', '\150', '\143', '\105', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\150', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\170', '\116', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\115', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\122', '\172', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\147', '\117', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\155', '\124', '\040', '\166', '\141', '\040', '\061', - '\012', '\104', '\143', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\157', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\116', '\161', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\150', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\102', '\161', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\127', '\166', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\155', '\105', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\143', '\144', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\131', '\152', '\040', '\154', '\145', '\040', '\061', - '\012', '\144', '\104', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\125', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\126', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\161', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\165', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\172', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\166', '\130', '\040', '\166', '\141', '\040', '\061', - '\012', '\120', '\171', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\165', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\114', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\161', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\126', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\147', '\163', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\152', '\106', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\153', '\107', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\112', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\172', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\111', '\170', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\115', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\146', '\121', '\040', '\144', '\145', '\040', '\061', - '\012', '\145', '\117', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\155', '\110', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\153', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\156', '\161', '\127', '\040', '\141', '\156', '\040', '\061', - '\012', '\156', '\112', '\144', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\105', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\126', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\132', '\171', '\146', '\040', '\156', '\171', '\040', '\061', - '\012', '\156', '\155', '\124', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\163', '\121', '\040', '\143', '\150', '\040', '\061', - '\012', '\120', '\153', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\144', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\153', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\121', '\156', '\143', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\102', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\115', '\152', '\166', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\155', '\112', '\040', '\155', '\145', '\040', '\061', - '\012', '\115', '\170', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\150', '\142', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\121', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\104', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\144', '\152', '\103', '\040', '\144', '\145', '\040', '\061', - '\012', '\143', '\144', '\121', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\156', '\114', '\040', '\141', '\156', '\040', '\061', - '\012', '\131', '\152', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\125', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\152', '\127', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\127', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\170', '\166', '\106', '\040', '\166', '\141', '\040', '\061', - '\012', '\107', '\161', '\151', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\107', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\130', '\165', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\103', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\113', '\170', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\154', '\116', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\144', '\114', '\040', '\144', '\145', '\040', '\061', - '\012', '\126', '\164', '\156', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\112', '\152', '\040', '\163', '\164', '\040', '\061', - '\012', '\153', '\121', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\146', '\130', '\040', '\146', '\157', '\040', '\061', - '\012', '\116', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\102', '\163', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\172', '\120', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\125', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\154', '\142', '\124', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\171', '\126', '\040', '\167', '\141', '\040', '\061', - '\012', '\130', '\153', '\155', '\040', '\153', '\141', '\040', '\061', - '\012', '\127', '\144', '\166', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\121', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\161', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\146', '\127', '\040', '\163', '\164', '\040', '\061', - '\012', '\147', '\146', '\115', '\040', '\156', '\147', '\040', '\061', - '\012', '\126', '\154', '\160', '\040', '\154', '\145', '\040', '\061', - '\012', '\130', '\152', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\150', '\111', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\167', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\170', '\132', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\151', '\113', '\167', '\040', '\151', '\156', '\040', '\061', - '\012', '\124', '\142', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\121', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\156', '\155', '\132', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\160', '\105', '\040', '\160', '\162', '\040', '\061', - '\012', '\172', '\123', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\106', '\147', '\151', '\040', '\156', '\147', '\040', '\061', - '\012', '\165', '\111', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\166', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\162', '\161', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\152', '\132', '\040', '\151', '\152', '\040', '\061', - '\012', '\116', '\152', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\153', '\167', '\106', '\040', '\153', '\141', '\040', '\061', - '\012', '\117', '\166', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\167', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\115', '\166', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\104', '\166', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\163', '\120', '\040', '\163', '\164', '\040', '\061', - '\012', '\147', '\132', '\161', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\130', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\107', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\154', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\116', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\116', '\166', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\144', '\132', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\170', '\126', '\040', '\166', '\141', '\040', '\061', - '\012', '\116', '\150', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\132', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\171', '\123', '\040', '\151', '\156', '\040', '\061', - '\012', '\161', '\132', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\162', '\132', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\154', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\152', '\115', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\131', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\151', '\171', '\106', '\040', '\151', '\156', '\040', '\061', - '\012', '\103', '\144', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\167', '\105', '\040', '\167', '\141', '\040', '\061', - '\012', '\170', '\146', '\126', '\040', '\146', '\157', '\040', '\061', - '\012', '\167', '\142', '\106', '\040', '\167', '\141', '\040', '\061', - '\012', '\167', '\165', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\154', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\103', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\143', '\132', '\040', '\143', '\150', '\040', '\061', - '\012', '\107', '\152', '\166', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\114', '\154', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\114', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\155', '\120', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\131', '\157', '\040', '\143', '\150', '\040', '\061', - '\012', '\122', '\150', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\162', '\115', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\104', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\131', '\171', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\165', '\171', '\127', '\040', '\165', '\156', '\040', '\061', - '\012', '\153', '\107', '\142', '\040', '\153', '\141', '\040', '\061', - '\012', '\151', '\167', '\113', '\040', '\151', '\156', '\040', '\061', - '\012', '\161', '\153', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\130', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\103', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\162', '\121', '\146', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\162', '\117', '\040', '\145', '\162', '\040', '\061', - '\012', '\106', '\172', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\123', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\120', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\102', '\161', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\127', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\150', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\102', '\167', '\040', '\153', '\141', '\040', '\061', - '\012', '\171', '\166', '\114', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\143', '\124', '\040', '\143', '\150', '\040', '\061', - '\012', '\106', '\142', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\105', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\105', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\165', '\121', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\110', '\167', '\040', '\165', '\163', '\040', '\061', - '\012', '\106', '\166', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\153', '\117', '\040', '\153', '\141', '\040', '\061', - '\012', '\167', '\151', '\131', '\040', '\151', '\156', '\040', '\061', - '\012', '\163', '\120', '\155', '\040', '\163', '\164', '\040', '\061', - '\012', '\144', '\106', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\121', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\163', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\125', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\164', '\114', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\122', '\153', '\040', '\163', '\164', '\040', '\061', - '\012', '\172', '\153', '\120', '\040', '\163', '\172', '\040', '\061', - '\012', '\155', '\166', '\106', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\131', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\163', '\167', '\131', '\040', '\151', '\163', '\040', '\061', - '\012', '\162', '\122', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\162', '\110', '\144', '\040', '\145', '\162', '\040', '\061', - '\012', '\142', '\104', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\154', '\127', '\166', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\161', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\157', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\115', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\160', '\146', '\112', '\040', '\160', '\162', '\040', '\061', - '\012', '\104', '\155', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\157', '\142', '\121', '\040', '\157', '\156', '\040', '\061', - '\012', '\126', '\146', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\126', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\103', '\152', '\166', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\113', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\152', '\105', '\040', '\151', '\152', '\040', '\061', - '\012', '\101', '\161', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\103', '\170', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\160', '\110', '\040', '\166', '\141', '\040', '\061', - '\012', '\114', '\170', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\160', '\110', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\157', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\122', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\131', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\144', '\125', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\113', '\170', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\125', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\150', '\104', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\104', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\127', '\163', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\172', '\132', '\040', '\163', '\172', '\040', '\061', - '\012', '\155', '\107', '\146', '\040', '\155', '\145', '\040', '\061', - '\012', '\152', '\152', '\126', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\146', '\122', '\040', '\160', '\162', '\040', '\061', - '\012', '\142', '\120', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\152', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\114', '\167', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\161', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\122', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\163', '\146', '\124', '\040', '\163', '\172', '\040', '\061', - '\012', '\107', '\162', '\167', '\040', '\145', '\162', '\040', '\061', - '\012', '\172', '\107', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\143', '\127', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\125', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\122', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\132', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\123', '\166', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\120', '\150', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\166', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\121', '\154', '\155', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\147', '\123', '\040', '\156', '\147', '\040', '\061', - '\012', '\115', '\155', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\120', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\161', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\127', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\111', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\103', '\170', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\167', '\164', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\113', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\164', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\122', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\172', '\163', '\102', '\040', '\163', '\172', '\040', '\061', - '\012', '\156', '\142', '\104', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\113', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\150', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\131', '\150', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\131', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\152', '\103', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\172', '\113', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\112', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\121', '\162', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\165', '\166', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\146', '\112', '\040', '\143', '\150', '\040', '\061', - '\012', '\151', '\161', '\130', '\040', '\151', '\156', '\040', '\061', - '\012', '\166', '\116', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\143', '\115', '\040', '\143', '\150', '\040', '\061', - '\012', '\127', '\166', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\155', '\123', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\127', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\141', '\111', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\155', '\123', '\040', '\151', '\152', '\040', '\061', - '\012', '\106', '\155', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\151', '\171', '\116', '\040', '\151', '\156', '\040', '\061', - '\012', '\142', '\132', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\113', '\172', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\126', '\167', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\125', '\154', '\170', '\040', '\154', '\145', '\040', '\061', - '\012', '\162', '\103', '\166', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\166', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\153', '\162', '\040', '\162', '\151', '\040', '\061', - '\012', '\146', '\152', '\103', '\040', '\151', '\152', '\040', '\061', - '\012', '\164', '\122', '\162', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\103', '\171', '\040', '\160', '\162', '\040', '\061', - '\012', '\146', '\142', '\103', '\040', '\142', '\145', '\040', '\061', - '\012', '\146', '\121', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\153', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\104', '\161', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\147', '\105', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\115', '\155', '\040', '\166', '\141', '\040', '\061', - '\012', '\144', '\120', '\142', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\152', '\114', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\113', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\120', '\171', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\145', '\130', '\166', '\040', '\145', '\162', '\040', '\061', - '\012', '\156', '\126', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\112', '\167', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\104', '\146', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\103', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\164', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\161', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\102', '\150', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\143', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\113', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\164', '\146', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\142', '\132', '\040', '\151', '\156', '\040', '\061', - '\012', '\116', '\172', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\127', '\156', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\130', '\171', '\040', '\166', '\141', '\040', '\061', - '\012', '\151', '\126', '\146', '\040', '\151', '\156', '\040', '\061', - '\012', '\144', '\170', '\124', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\170', '\121', '\040', '\151', '\152', '\040', '\061', - '\012', '\104', '\144', '\166', '\040', '\144', '\145', '\040', '\061', - '\012', '\155', '\130', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\125', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\147', '\121', '\040', '\156', '\147', '\040', '\061', - '\012', '\114', '\147', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\147', '\131', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\115', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\160', '\112', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\132', '\170', '\040', '\163', '\164', '\040', '\061', - '\012', '\156', '\130', '\172', '\040', '\141', '\156', '\040', '\061', - '\012', '\127', '\166', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\154', '\126', '\153', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\103', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\170', '\166', '\111', '\040', '\166', '\141', '\040', '\061', - '\012', '\155', '\146', '\112', '\040', '\155', '\145', '\040', '\061', - '\012', '\164', '\121', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\124', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\126', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\111', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\166', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\146', '\116', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\121', '\163', '\040', '\156', '\147', '\040', '\061', - '\012', '\151', '\126', '\160', '\040', '\151', '\156', '\040', '\061', - '\012', '\152', '\107', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\115', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\170', '\166', '\167', '\040', '\167', '\151', '\040', '\061', - '\012', '\172', '\111', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\146', '\122', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\127', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\145', '\150', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\132', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\155', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\114', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\132', '\142', '\040', '\160', '\162', '\040', '\061', - '\012', '\166', '\156', '\112', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\166', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\130', '\150', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\152', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\147', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\141', '\112', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\123', '\146', '\040', '\155', '\145', '\040', '\061', - '\012', '\130', '\172', '\155', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\124', '\172', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\130', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\160', '\121', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\103', '\161', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\123', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\160', '\162', '\127', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\104', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\130', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\143', '\104', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\147', '\132', '\040', '\156', '\147', '\040', '\061', - '\012', '\124', '\172', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\143', '\122', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\167', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\130', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\131', '\167', '\166', '\040', '\167', '\151', '\040', '\061', - '\012', '\162', '\160', '\113', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\120', '\163', '\040', '\151', '\163', '\040', '\061', - '\012', '\113', '\152', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\104', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\152', '\162', '\106', '\040', '\145', '\162', '\040', '\061', - '\012', '\142', '\142', '\121', '\040', '\142', '\145', '\040', '\061', - '\012', '\121', '\144', '\142', '\040', '\144', '\145', '\040', '\061', - '\012', '\162', '\113', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\131', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\170', '\101', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\150', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\163', '\125', '\040', '\163', '\164', '\040', '\061', - '\012', '\172', '\130', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\165', '\167', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\163', '\122', '\040', '\163', '\164', '\040', '\061', - '\012', '\153', '\110', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\127', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\146', '\123', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\111', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\142', '\143', '\127', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\144', '\115', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\103', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\172', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\121', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\157', '\152', '\130', '\040', '\157', '\156', '\040', '\061', - '\012', '\126', '\161', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\127', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\153', '\142', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\156', '\112', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\112', '\172', '\040', '\163', '\164', '\040', '\061', - '\012', '\150', '\122', '\162', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\130', '\163', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\145', '\142', '\040', '\145', '\162', '\040', '\061', - '\012', '\125', '\167', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\156', '\131', '\147', '\040', '\141', '\156', '\040', '\061', - '\012', '\131', '\146', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\170', '\162', '\107', '\040', '\145', '\162', '\040', '\061', - '\012', '\145', '\132', '\162', '\040', '\154', '\145', '\040', '\061', - '\012', '\165', '\146', '\126', '\040', '\165', '\163', '\040', '\061', - '\012', '\162', '\130', '\155', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\132', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\121', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\124', '\156', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\122', '\155', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\154', '\115', '\040', '\154', '\145', '\040', '\061', - '\012', '\143', '\161', '\117', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\127', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\152', '\143', '\132', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\146', '\126', '\040', '\151', '\152', '\040', '\061', - '\012', '\132', '\155', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\170', '\115', '\040', '\142', '\145', '\040', '\061', - '\012', '\146', '\106', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\147', '\152', '\120', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\115', '\163', '\040', '\164', '\150', '\040', '\061', - '\012', '\131', '\163', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\153', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\113', '\155', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\131', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\144', '\166', '\130', '\040', '\144', '\145', '\040', '\061', - '\012', '\162', '\167', '\103', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\167', '\127', '\040', '\167', '\141', '\040', '\061', - '\012', '\121', '\160', '\171', '\040', '\160', '\162', '\040', '\061', - '\012', '\152', '\130', '\171', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\117', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\155', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\105', '\161', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\112', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\110', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\150', '\104', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\104', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\153', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\114', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\110', '\155', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\156', '\130', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\170', '\123', '\040', '\151', '\152', '\040', '\061', - '\012', '\112', '\164', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\147', '\105', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\160', '\110', '\040', '\160', '\162', '\040', '\061', - '\012', '\111', '\161', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\115', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\155', '\105', '\040', '\144', '\145', '\040', '\061', - '\012', '\110', '\146', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\123', '\142', '\040', '\160', '\162', '\040', '\061', - '\012', '\170', '\150', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\152', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\146', '\130', '\040', '\156', '\171', '\040', '\061', - '\012', '\166', '\165', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\106', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\172', '\156', '\123', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\154', '\126', '\040', '\154', '\145', '\040', '\061', - '\012', '\154', '\153', '\113', '\040', '\154', '\145', '\040', '\061', - '\012', '\106', '\166', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\152', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\157', '\121', '\040', '\157', '\156', '\040', '\061', - '\012', '\127', '\166', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\115', '\156', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\115', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\147', '\143', '\106', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\142', '\102', '\040', '\144', '\145', '\040', '\061', - '\012', '\103', '\161', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\103', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\112', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\104', '\146', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\163', '\152', '\114', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\151', '\107', '\040', '\151', '\156', '\040', '\061', - '\012', '\132', '\154', '\163', '\040', '\154', '\145', '\040', '\061', - '\012', '\126', '\163', '\146', '\040', '\163', '\164', '\040', '\061', - '\012', '\106', '\147', '\144', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\155', '\104', '\040', '\155', '\145', '\040', '\061', - '\012', '\104', '\170', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\161', '\162', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\112', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\114', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\144', '\102', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\142', '\115', '\040', '\142', '\145', '\040', '\061', - '\012', '\155', '\166', '\115', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\164', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\156', '\102', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\164', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\113', '\163', '\144', '\040', '\163', '\164', '\040', '\061', - '\012', '\167', '\161', '\154', '\040', '\167', '\141', '\040', '\061', - '\012', '\155', '\150', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\157', '\112', '\171', '\040', '\157', '\156', '\040', '\061', - '\012', '\107', '\150', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\157', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\163', '\111', '\040', '\163', '\164', '\040', '\061', - '\012', '\166', '\106', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\131', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\154', '\156', '\126', '\040', '\141', '\156', '\040', '\061', - '\012', '\165', '\130', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\105', '\157', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\143', '\115', '\040', '\167', '\141', '\040', '\061', - '\012', '\152', '\167', '\113', '\040', '\151', '\152', '\040', '\061', - '\012', '\107', '\153', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\165', '\106', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\143', '\147', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\161', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\164', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\110', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\145', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\152', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\156', '\165', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\106', '\143', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\113', '\161', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\114', '\161', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\167', '\125', '\040', '\155', '\145', '\040', '\061', - '\012', '\146', '\121', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\153', '\123', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\156', '\131', '\166', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\107', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\166', '\132', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\161', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\106', '\150', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\115', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\102', '\150', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\130', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\161', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\171', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\113', '\162', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\156', '\166', '\040', '\141', '\156', '\040', '\061', - '\012', '\165', '\165', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\163', '\172', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\113', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\171', '\111', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\116', '\143', '\144', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\114', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\123', '\163', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\142', '\105', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\141', '\127', '\040', '\141', '\156', '\040', '\061', - '\012', '\122', '\164', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\142', '\106', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\147', '\122', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\143', '\132', '\040', '\143', '\150', '\040', '\061', - '\012', '\162', '\110', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\145', '\131', '\167', '\040', '\145', '\162', '\040', '\061', - '\012', '\114', '\170', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\122', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\160', '\116', '\040', '\151', '\152', '\040', '\061', - '\012', '\162', '\152', '\127', '\040', '\145', '\162', '\040', '\061', - '\012', '\154', '\147', '\113', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\103', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\107', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\172', '\124', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\121', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\153', '\154', '\112', '\040', '\154', '\151', '\040', '\061', - '\012', '\143', '\161', '\153', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\115', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\131', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\150', '\121', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\170', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\145', '\131', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\150', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\102', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\146', '\126', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\146', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\142', '\124', '\040', '\163', '\164', '\040', '\061', - '\012', '\144', '\121', '\171', '\040', '\144', '\145', '\040', '\061', - '\012', '\106', '\155', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\150', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\164', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\162', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\171', '\161', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\104', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\146', '\126', '\040', '\155', '\145', '\040', '\061', - '\012', '\157', '\123', '\170', '\040', '\157', '\156', '\040', '\061', - '\012', '\112', '\170', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\117', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\112', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\166', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\105', '\161', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\161', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\170', '\111', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\113', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\144', '\127', '\040', '\144', '\145', '\040', '\061', - '\012', '\143', '\143', '\115', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\143', '\127', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\106', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\122', '\166', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\156', '\116', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\142', '\125', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\116', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\152', '\113', '\040', '\151', '\152', '\040', '\061', - '\012', '\112', '\142', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\102', '\146', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\145', '\130', '\040', '\154', '\145', '\040', '\061', - '\012', '\164', '\130', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\154', '\112', '\040', '\154', '\145', '\040', '\061', - '\012', '\143', '\113', '\144', '\040', '\143', '\150', '\040', '\061', - '\012', '\156', '\103', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\147', '\126', '\040', '\156', '\147', '\040', '\061', - '\012', '\115', '\150', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\113', '\146', '\040', '\163', '\164', '\040', '\061', - '\012', '\150', '\161', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\144', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\172', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\116', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\152', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\143', '\116', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\143', '\112', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\152', '\125', '\040', '\144', '\145', '\040', '\061', - '\012', '\131', '\147', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\157', '\111', '\040', '\157', '\156', '\040', '\061', - '\012', '\131', '\171', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\153', '\121', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\146', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\162', '\114', '\040', '\141', '\156', '\040', '\061', - '\012', '\154', '\121', '\163', '\040', '\154', '\145', '\040', '\061', - '\012', '\155', '\164', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\142', '\130', '\040', '\167', '\141', '\040', '\061', - '\012', '\147', '\155', '\122', '\040', '\156', '\147', '\040', '\061', - '\012', '\132', '\163', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\164', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\142', '\106', '\040', '\155', '\145', '\040', '\061', - '\012', '\146', '\147', '\124', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\127', '\165', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\170', '\107', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\116', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\146', '\127', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\162', '\103', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\157', '\130', '\040', '\157', '\156', '\040', '\061', - '\012', '\167', '\152', '\124', '\040', '\151', '\152', '\040', '\061', - '\012', '\120', '\161', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\153', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\156', '\114', '\172', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\152', '\126', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\143', '\120', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\154', '\121', '\040', '\154', '\145', '\040', '\061', - '\012', '\106', '\147', '\161', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\147', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\107', '\161', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\113', '\163', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\146', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\171', '\132', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\151', '\132', '\040', '\151', '\156', '\040', '\061', - '\012', '\162', '\130', '\166', '\040', '\145', '\162', '\040', '\061', - '\012', '\131', '\143', '\171', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\166', '\101', '\040', '\166', '\141', '\040', '\061', - '\012', '\124', '\161', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\132', '\171', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\167', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\126', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\115', '\150', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\123', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\150', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\172', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\107', '\166', '\155', '\040', '\166', '\141', '\040', '\061', - '\012', '\143', '\161', '\125', '\040', '\143', '\150', '\040', '\061', - '\012', '\110', '\150', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\121', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\167', '\114', '\040', '\160', '\162', '\040', '\061', - '\012', '\163', '\116', '\167', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\105', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\116', '\172', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\163', '\104', '\040', '\163', '\164', '\040', '\061', - '\012', '\155', '\104', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\122', '\164', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\114', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\124', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\170', '\112', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\161', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\161', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\162', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\161', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\111', '\171', '\040', '\155', '\145', '\040', '\061', - '\012', '\111', '\160', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\152', '\103', '\040', '\151', '\152', '\040', '\061', - '\012', '\154', '\114', '\160', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\161', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\127', '\147', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\131', '\143', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\152', '\125', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\130', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\161', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\170', '\124', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\156', '\130', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\102', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\154', '\163', '\040', '\154', '\145', '\040', '\061', - '\012', '\153', '\150', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\161', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\142', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\151', '\104', '\170', '\040', '\154', '\151', '\040', '\061', - '\012', '\132', '\156', '\160', '\040', '\141', '\156', '\040', '\061', - '\012', '\112', '\170', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\161', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\142', '\125', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\122', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\160', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\154', '\107', '\040', '\154', '\145', '\040', '\061', - '\012', '\127', '\147', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\126', '\170', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\123', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\151', '\150', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\172', '\124', '\040', '\163', '\172', '\040', '\061', - '\012', '\141', '\145', '\132', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\113', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\127', '\163', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\114', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\160', '\113', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\112', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\107', '\166', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\105', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\163', '\113', '\144', '\040', '\163', '\164', '\040', '\061', - '\012', '\170', '\150', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\141', '\115', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\145', '\150', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\146', '\132', '\040', '\153', '\165', '\040', '\061', - '\012', '\127', '\167', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\131', '\155', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\126', '\153', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\142', '\172', '\104', '\040', '\163', '\172', '\040', '\061', - '\012', '\130', '\153', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\126', '\172', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\166', '\126', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\110', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\113', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\155', '\115', '\040', '\166', '\141', '\040', '\061', - '\012', '\121', '\170', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\116', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\142', '\161', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\161', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\161', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\166', '\155', '\040', '\166', '\141', '\040', '\061', - '\012', '\154', '\102', '\146', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\161', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\103', '\163', '\040', '\156', '\147', '\040', '\061', - '\012', '\162', '\122', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\122', '\156', '\155', '\040', '\141', '\156', '\040', '\061', - '\012', '\114', '\172', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\151', '\167', '\116', '\040', '\151', '\156', '\040', '\061', - '\012', '\160', '\146', '\116', '\040', '\160', '\162', '\040', '\061', - '\012', '\150', '\103', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\165', '\110', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\114', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\167', '\104', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\152', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\117', '\152', '\171', '\040', '\151', '\152', '\040', '\061', - '\012', '\144', '\155', '\126', '\040', '\144', '\151', '\040', '\061', - '\012', '\143', '\103', '\167', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\130', '\163', '\040', '\154', '\145', '\040', '\061', - '\012', '\163', '\155', '\122', '\040', '\163', '\164', '\040', '\061', - '\012', '\155', '\170', '\117', '\040', '\155', '\145', '\040', '\061', - '\012', '\112', '\162', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\152', '\116', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\102', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\170', '\121', '\040', '\143', '\150', '\040', '\061', - '\012', '\113', '\144', '\160', '\040', '\144', '\145', '\040', '\061', - '\012', '\104', '\154', '\142', '\040', '\154', '\145', '\040', '\061', - '\012', '\160', '\161', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\161', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\123', '\160', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\103', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\146', '\120', '\040', '\156', '\147', '\040', '\061', - '\012', '\165', '\107', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\142', '\105', '\040', '\142', '\145', '\040', '\061', - '\012', '\130', '\160', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\130', '\172', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\161', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\161', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\113', '\166', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\127', '\151', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\170', '\132', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\157', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\123', '\147', '\146', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\122', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\127', '\147', '\151', '\040', '\156', '\147', '\040', '\061', - '\012', '\145', '\104', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\127', '\167', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\106', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\113', '\170', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\151', '\127', '\160', '\040', '\151', '\156', '\040', '\061', - '\012', '\146', '\122', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\167', '\164', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\167', '\127', '\040', '\163', '\164', '\040', '\061', - '\012', '\147', '\162', '\113', '\040', '\156', '\147', '\040', '\061', - '\012', '\110', '\146', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\146', '\132', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\161', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\113', '\152', '\040', '\157', '\156', '\040', '\061', - '\012', '\166', '\146', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\127', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\165', '\127', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\103', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\153', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\104', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\123', '\146', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\165', '\131', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\166', '\122', '\040', '\166', '\141', '\040', '\061', - '\012', '\145', '\101', '\157', '\040', '\145', '\162', '\040', '\061', - '\012', '\160', '\131', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\122', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\151', '\127', '\144', '\040', '\151', '\156', '\040', '\061', - '\012', '\147', '\107', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\130', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\153', '\143', '\120', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\143', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\103', '\146', '\040', '\154', '\145', '\040', '\061', - '\012', '\147', '\155', '\127', '\040', '\156', '\147', '\040', '\061', - '\012', '\110', '\153', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\162', '\150', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\161', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\121', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\103', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\127', '\152', '\040', '\144', '\145', '\040', '\061', - '\012', '\110', '\162', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\163', '\124', '\172', '\040', '\163', '\164', '\040', '\061', - '\012', '\141', '\126', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\167', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\166', '\105', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\113', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\170', '\143', '\131', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\160', '\115', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\154', '\103', '\040', '\154', '\145', '\040', '\061', - '\012', '\144', '\154', '\107', '\040', '\154', '\145', '\040', '\061', - '\012', '\157', '\124', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\151', '\114', '\160', '\040', '\151', '\156', '\040', '\061', - '\012', '\170', '\163', '\114', '\040', '\163', '\164', '\040', '\061', - '\012', '\154', '\106', '\172', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\150', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\154', '\130', '\040', '\154', '\145', '\040', '\061', - '\012', '\160', '\155', '\117', '\040', '\155', '\145', '\040', '\061', - '\012', '\131', '\143', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\131', '\156', '\160', '\040', '\141', '\156', '\040', '\061', - '\012', '\131', '\142', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\121', '\154', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\170', '\101', '\040', '\142', '\145', '\040', '\061', - '\012', '\164', '\106', '\163', '\040', '\164', '\150', '\040', '\061', - '\012', '\114', '\161', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\143', '\125', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\146', '\113', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\160', '\121', '\040', '\166', '\141', '\040', '\061', - '\012', '\104', '\164', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\124', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\126', '\166', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\121', '\142', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\172', '\127', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\123', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\172', '\160', '\113', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\124', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\155', '\153', '\103', '\040', '\153', '\141', '\040', '\061', - '\012', '\143', '\122', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\102', '\153', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\107', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\156', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\141', '\161', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\150', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\167', '\120', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\161', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\143', '\125', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\154', '\123', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\152', '\105', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\161', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\122', '\170', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\126', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\165', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\162', '\102', '\040', '\145', '\162', '\040', '\061', - '\012', '\121', '\171', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\123', '\147', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\131', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\120', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\106', '\144', '\166', '\040', '\144', '\145', '\040', '\061', - '\012', '\130', '\155', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\143', '\120', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\120', '\161', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\131', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\112', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\144', '\121', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\170', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\110', '\167', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\147', '\103', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\152', '\113', '\040', '\151', '\152', '\040', '\061', - '\012', '\156', '\162', '\103', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\161', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\102', '\147', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\103', '\142', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\125', '\167', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\167', '\143', '\112', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\102', '\146', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\124', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\167', '\130', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\127', '\147', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\117', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\142', '\102', '\040', '\142', '\145', '\040', '\061', - '\012', '\170', '\161', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\121', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\157', '\121', '\040', '\157', '\156', '\040', '\061', - '\012', '\171', '\152', '\127', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\166', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\142', '\106', '\040', '\142', '\145', '\040', '\061', - '\012', '\156', '\127', '\165', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\152', '\121', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\152', '\113', '\040', '\143', '\150', '\040', '\061', - '\012', '\123', '\170', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\142', '\130', '\040', '\142', '\145', '\040', '\061', - '\012', '\145', '\131', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\102', '\155', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\104', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\130', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\156', '\115', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\123', '\170', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\154', '\110', '\155', '\040', '\154', '\145', '\040', '\061', - '\012', '\147', '\146', '\131', '\040', '\156', '\147', '\040', '\061', - '\012', '\156', '\167', '\107', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\110', '\154', '\040', '\156', '\147', '\040', '\061', - '\012', '\127', '\160', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\167', '\106', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\150', '\107', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\167', '\103', '\040', '\167', '\141', '\040', '\061', - '\012', '\115', '\154', '\146', '\040', '\154', '\145', '\040', '\061', - '\012', '\143', '\112', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\156', '\103', '\040', '\141', '\156', '\040', '\061', - '\012', '\106', '\166', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\164', '\107', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\150', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\153', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\167', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\142', '\113', '\040', '\142', '\145', '\040', '\061', - '\012', '\172', '\126', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\124', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\162', '\104', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\122', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\106', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\150', '\127', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\172', '\105', '\040', '\154', '\145', '\040', '\061', - '\012', '\154', '\167', '\130', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\110', '\171', '\040', '\151', '\152', '\040', '\061', - '\012', '\121', '\161', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\104', '\161', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\124', '\166', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\120', '\142', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\120', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\144', '\124', '\040', '\163', '\172', '\040', '\061', - '\012', '\155', '\166', '\101', '\040', '\166', '\141', '\040', '\061', - '\012', '\132', '\166', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\141', '\125', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\167', '\121', '\040', '\167', '\141', '\040', '\061', - '\012', '\122', '\163', '\167', '\040', '\163', '\164', '\040', '\061', - '\012', '\153', '\154', '\102', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\154', '\116', '\040', '\154', '\145', '\040', '\061', - '\012', '\107', '\166', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\144', '\112', '\040', '\144', '\145', '\040', '\061', - '\012', '\154', '\143', '\102', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\124', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\150', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\114', '\166', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\172', '\122', '\040', '\163', '\172', '\040', '\061', - '\012', '\130', '\171', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\130', '\154', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\161', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\172', '\150', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\147', '\124', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\160', '\107', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\153', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\161', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\143', '\147', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\146', '\102', '\040', '\142', '\145', '\040', '\061', - '\012', '\127', '\160', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\127', '\170', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\130', '\142', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\106', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\122', '\146', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\150', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\170', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\113', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\164', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\130', '\145', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\130', '\155', '\040', '\163', '\172', '\040', '\061', - '\012', '\107', '\150', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\172', '\131', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\130', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\170', '\127', '\040', '\153', '\141', '\040', '\061', - '\012', '\166', '\126', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\112', '\170', '\165', '\040', '\165', '\156', '\040', '\061', - '\012', '\142', '\142', '\130', '\040', '\142', '\145', '\040', '\061', - '\012', '\162', '\120', '\142', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\103', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\151', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\147', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\116', '\150', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\107', '\160', '\040', '\160', '\157', '\040', '\061', - '\012', '\150', '\120', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\124', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\111', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\112', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\143', '\105', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\103', '\142', '\040', '\155', '\145', '\040', '\061', - '\012', '\142', '\112', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\156', '\172', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\161', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\110', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\142', '\167', '\110', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\103', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\125', '\161', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\170', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\160', '\117', '\040', '\160', '\162', '\040', '\061', - '\012', '\153', '\143', '\116', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\153', '\126', '\040', '\153', '\141', '\040', '\061', - '\012', '\155', '\121', '\142', '\040', '\155', '\145', '\040', '\061', - '\012', '\131', '\161', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\126', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\166', '\142', '\130', '\040', '\166', '\141', '\040', '\061', - '\012', '\155', '\124', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\130', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\167', '\161', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\113', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\153', '\123', '\040', '\153', '\141', '\040', '\061', - '\012', '\127', '\166', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\111', '\171', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\107', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\172', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\142', '\150', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\166', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\130', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\156', '\130', '\143', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\112', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\116', '\161', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\131', '\152', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\106', '\150', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\171', '\113', '\040', '\151', '\152', '\040', '\061', - '\012', '\112', '\172', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\161', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\155', '\132', '\040', '\155', '\145', '\040', '\061', - '\012', '\172', '\142', '\106', '\040', '\163', '\172', '\040', '\061', - '\012', '\163', '\160', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\120', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\123', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\115', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\130', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\171', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\106', '\167', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\155', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\116', '\154', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\161', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\107', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\155', '\130', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\131', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\155', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\104', '\161', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\127', '\153', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\144', '\160', '\124', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\171', '\112', '\040', '\151', '\152', '\040', '\061', - '\012', '\112', '\161', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\152', '\132', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\116', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\101', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\102', '\156', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\160', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\147', '\127', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\130', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\162', '\115', '\154', '\040', '\145', '\162', '\040', '\061', - '\012', '\172', '\147', '\126', '\040', '\156', '\147', '\040', '\061', - '\012', '\156', '\114', '\160', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\106', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\164', '\166', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\121', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\146', '\144', '\106', '\040', '\144', '\145', '\040', '\061', - '\012', '\142', '\170', '\113', '\040', '\142', '\145', '\040', '\061', - '\012', '\102', '\143', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\162', '\160', '\131', '\040', '\145', '\162', '\040', '\061', - '\012', '\163', '\112', '\142', '\040', '\163', '\164', '\040', '\061', - '\012', '\113', '\166', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\116', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\110', '\144', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\172', '\106', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\112', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\146', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\121', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\160', '\113', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\150', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\132', '\151', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\150', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\161', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\156', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\112', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\112', '\153', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\122', '\167', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\172', '\166', '\115', '\040', '\166', '\141', '\040', '\061', - '\012', '\142', '\170', '\131', '\040', '\142', '\145', '\040', '\061', - '\012', '\160', '\130', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\125', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\160', '\166', '\105', '\040', '\166', '\141', '\040', '\061', - '\012', '\114', '\160', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\144', '\172', '\126', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\111', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\167', '\132', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\156', '\160', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\127', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\152', '\147', '\121', '\040', '\156', '\147', '\040', '\061', - '\012', '\112', '\161', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\155', '\130', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\146', '\115', '\040', '\151', '\152', '\040', '\061', - '\012', '\154', '\127', '\152', '\040', '\154', '\145', '\040', '\061', - '\012', '\160', '\142', '\116', '\040', '\160', '\162', '\040', '\061', - '\012', '\146', '\166', '\106', '\040', '\166', '\141', '\040', '\061', - '\012', '\163', '\104', '\144', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\144', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\162', '\114', '\040', '\145', '\162', '\040', '\061', - '\012', '\165', '\110', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\167', '\116', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\102', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\172', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\104', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\121', '\143', '\172', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\172', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\105', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\170', '\110', '\040', '\160', '\162', '\040', '\061', - '\012', '\146', '\161', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\161', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\153', '\104', '\040', '\156', '\147', '\040', '\061', - '\012', '\130', '\146', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\130', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\103', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\120', '\172', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\122', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\161', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\166', '\127', '\040', '\166', '\141', '\040', '\061', - '\012', '\122', '\146', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\147', '\161', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\147', '\117', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\125', '\171', '\040', '\167', '\141', '\040', '\061', - '\012', '\112', '\153', '\167', '\040', '\153', '\141', '\040', '\061', - '\012', '\150', '\123', '\163', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\153', '\127', '\040', '\156', '\147', '\040', '\061', - '\012', '\121', '\147', '\171', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\112', '\142', '\040', '\144', '\145', '\040', '\061', - '\012', '\160', '\162', '\106', '\040', '\145', '\162', '\040', '\061', - '\012', '\142', '\165', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\126', '\147', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\164', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\104', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\131', '\147', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\113', '\161', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\125', '\171', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\154', '\112', '\153', '\040', '\154', '\145', '\040', '\061', - '\012', '\163', '\170', '\131', '\040', '\163', '\164', '\040', '\061', - '\012', '\170', '\146', '\131', '\040', '\146', '\157', '\040', '\061', - '\012', '\130', '\153', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\147', '\132', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\171', '\130', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\142', '\106', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\124', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\163', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\154', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\172', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\153', '\161', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\160', '\121', '\040', '\160', '\157', '\040', '\061', - '\012', '\161', '\112', '\165', '\040', '\165', '\156', '\040', '\061', - '\012', '\150', '\131', '\151', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\154', '\115', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\104', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\166', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\116', '\163', '\146', '\040', '\163', '\164', '\040', '\061', - '\012', '\142', '\112', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\116', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\121', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\113', '\161', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\113', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\155', '\110', '\160', '\040', '\155', '\145', '\040', '\061', - '\012', '\125', '\171', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\170', '\131', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\111', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\124', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\146', '\120', '\040', '\167', '\141', '\040', '\061', - '\012', '\146', '\170', '\111', '\040', '\146', '\157', '\040', '\061', - '\012', '\166', '\121', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\166', '\116', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\167', '\116', '\040', '\160', '\162', '\040', '\061', - '\012', '\166', '\141', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\170', '\121', '\040', '\155', '\145', '\040', '\061', - '\012', '\142', '\144', '\126', '\040', '\144', '\145', '\040', '\061', - '\012', '\103', '\147', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\152', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\127', '\161', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\160', '\117', '\040', '\160', '\162', '\040', '\061', - '\012', '\167', '\157', '\121', '\040', '\157', '\156', '\040', '\061', - '\012', '\170', '\131', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\160', '\124', '\040', '\160', '\162', '\040', '\061', - '\012', '\154', '\116', '\160', '\040', '\154', '\145', '\040', '\061', - '\012', '\160', '\166', '\130', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\114', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\113', '\163', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\162', '\127', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\151', '\125', '\171', '\040', '\151', '\156', '\040', '\061', - '\012', '\142', '\146', '\130', '\040', '\142', '\145', '\040', '\061', - '\012', '\170', '\163', '\126', '\040', '\163', '\164', '\040', '\061', - '\012', '\130', '\156', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\155', '\127', '\040', '\144', '\145', '\040', '\061', - '\012', '\157', '\121', '\167', '\040', '\157', '\156', '\040', '\061', - '\012', '\132', '\170', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\117', '\141', '\171', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\152', '\107', '\040', '\151', '\152', '\040', '\061', - '\012', '\132', '\142', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\161', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\170', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\127', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\125', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\170', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\103', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\146', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\166', '\125', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\111', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\104', '\146', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\132', '\155', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\103', '\161', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\121', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\116', '\142', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\112', '\163', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\150', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\172', '\121', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\131', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\102', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\143', '\126', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\107', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\126', '\167', '\040', '\151', '\156', '\040', '\061', - '\012', '\106', '\172', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\152', '\110', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\165', '\131', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\167', '\123', '\040', '\151', '\152', '\040', '\061', - '\012', '\103', '\161', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\112', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\153', '\144', '\112', '\040', '\144', '\145', '\040', '\061', - '\012', '\153', '\144', '\124', '\040', '\144', '\145', '\040', '\061', - '\012', '\156', '\161', '\102', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\127', '\163', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\163', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\114', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\144', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\147', '\126', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\131', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\145', '\132', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\146', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\166', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\141', '\126', '\160', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\115', '\163', '\040', '\156', '\147', '\040', '\061', - '\012', '\120', '\142', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\155', '\121', '\146', '\040', '\155', '\145', '\040', '\061', - '\012', '\171', '\125', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\166', '\107', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\147', '\106', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\166', '\131', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\162', '\101', '\040', '\145', '\162', '\040', '\061', - '\012', '\171', '\162', '\115', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\115', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\125', '\171', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\144', '\114', '\160', '\040', '\144', '\145', '\040', '\061', - '\012', '\107', '\152', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\105', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\130', '\144', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\110', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\157', '\120', '\172', '\040', '\157', '\156', '\040', '\061', - '\012', '\170', '\111', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\103', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\104', '\172', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\152', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\107', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\152', '\125', '\040', '\151', '\152', '\040', '\061', - '\012', '\103', '\152', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\113', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\166', '\117', '\040', '\166', '\141', '\040', '\061', - '\012', '\120', '\172', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\162', '\113', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\150', '\117', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\154', '\102', '\040', '\154', '\145', '\040', '\061', - '\012', '\154', '\104', '\153', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\154', '\117', '\040', '\154', '\145', '\040', '\061', - '\012', '\160', '\147', '\110', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\121', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\163', '\144', '\132', '\040', '\163', '\164', '\040', '\061', - '\012', '\153', '\121', '\155', '\040', '\153', '\141', '\040', '\061', - '\012', '\154', '\122', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\157', '\121', '\171', '\040', '\157', '\156', '\040', '\061', - '\012', '\164', '\167', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\102', '\144', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\121', '\152', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\156', '\120', '\040', '\141', '\156', '\040', '\061', - '\012', '\116', '\156', '\160', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\151', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\103', '\143', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\110', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\114', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\163', '\146', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\113', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\146', '\153', '\105', '\040', '\153', '\141', '\040', '\061', - '\012', '\152', '\154', '\130', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\132', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\126', '\167', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\142', '\101', '\040', '\163', '\172', '\040', '\061', - '\012', '\110', '\150', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\142', '\131', '\040', '\143', '\150', '\040', '\061', - '\012', '\111', '\153', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\107', '\162', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\152', '\160', '\120', '\040', '\151', '\152', '\040', '\061', - '\012', '\121', '\146', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\150', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\155', '\130', '\040', '\155', '\145', '\040', '\061', - '\012', '\141', '\112', '\142', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\146', '\117', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\130', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\130', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\156', '\126', '\040', '\141', '\156', '\040', '\061', - '\012', '\131', '\160', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\172', '\103', '\171', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\150', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\130', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\107', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\170', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\170', '\124', '\040', '\143', '\150', '\040', '\061', - '\012', '\132', '\163', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\165', '\107', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\172', '\115', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\152', '\123', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\146', '\123', '\040', '\144', '\145', '\040', '\061', - '\012', '\147', '\160', '\110', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\147', '\117', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\161', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\146', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\124', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\132', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\105', '\152', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\121', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\131', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\152', '\126', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\127', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\146', '\122', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\165', '\123', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\103', '\170', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\114', '\143', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\172', '\113', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\161', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\112', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\103', '\152', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\166', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\167', '\116', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\155', '\122', '\040', '\155', '\145', '\040', '\061', - '\012', '\142', '\164', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\124', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\153', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\150', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\111', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\163', '\121', '\040', '\163', '\164', '\040', '\061', - '\012', '\147', '\123', '\144', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\104', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\126', '\152', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\155', '\111', '\040', '\155', '\145', '\040', '\061', - '\012', '\166', '\127', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\113', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\120', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\157', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\113', '\147', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\167', '\130', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\147', '\112', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\127', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\121', '\146', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\150', '\153', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\161', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\167', '\127', '\040', '\151', '\152', '\040', '\061', - '\012', '\163', '\121', '\172', '\040', '\163', '\164', '\040', '\061', - '\012', '\167', '\125', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\155', '\113', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\157', '\121', '\146', '\040', '\157', '\156', '\040', '\061', - '\012', '\152', '\126', '\153', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\167', '\124', '\040', '\167', '\141', '\040', '\061', - '\012', '\163', '\124', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\161', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\154', '\160', '\040', '\154', '\145', '\040', '\061', - '\012', '\160', '\115', '\142', '\040', '\160', '\162', '\040', '\061', - '\012', '\170', '\113', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\160', '\130', '\040', '\160', '\162', '\040', '\061', - '\012', '\166', '\121', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\112', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\113', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\153', '\112', '\040', '\153', '\141', '\040', '\061', - '\012', '\152', '\142', '\121', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\132', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\130', '\147', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\172', '\125', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\124', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\160', '\116', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\167', '\104', '\040', '\145', '\162', '\040', '\061', - '\012', '\121', '\144', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\161', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\162', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\167', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\167', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\172', '\106', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\154', '\127', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\172', '\120', '\040', '\163', '\172', '\040', '\061', - '\012', '\127', '\170', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\162', '\104', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\107', '\160', '\040', '\144', '\145', '\040', '\061', - '\012', '\132', '\164', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\125', '\166', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\145', '\107', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\132', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\121', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\106', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\115', '\161', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\156', '\104', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\166', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\111', '\171', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\146', '\104', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\113', '\142', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\131', '\155', '\040', '\166', '\141', '\040', '\061', - '\012', '\127', '\170', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\113', '\167', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\162', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\103', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\170', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\150', '\105', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\144', '\125', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\107', '\152', '\040', '\163', '\164', '\040', '\061', - '\012', '\107', '\167', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\131', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\155', '\125', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\104', '\155', '\040', '\160', '\157', '\040', '\061', - '\012', '\161', '\155', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\124', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\121', '\170', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\126', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\101', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\105', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\113', '\160', '\171', '\040', '\160', '\162', '\040', '\061', - '\012', '\110', '\161', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\103', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\141', '\161', '\132', '\040', '\141', '\156', '\040', '\061', - '\012', '\154', '\125', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\120', '\166', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\104', '\161', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\144', '\115', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\172', '\114', '\040', '\163', '\172', '\040', '\061', - '\012', '\102', '\150', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\107', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\164', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\124', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\125', '\170', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\126', '\166', '\155', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\110', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\132', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\150', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\144', '\132', '\040', '\144', '\145', '\040', '\061', - '\012', '\150', '\132', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\120', '\155', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\146', '\124', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\152', '\111', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\144', '\132', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\153', '\121', '\040', '\151', '\152', '\040', '\061', - '\012', '\123', '\144', '\152', '\040', '\144', '\145', '\040', '\061', - '\012', '\150', '\104', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\145', '\112', '\152', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\152', '\131', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\114', '\155', '\040', '\163', '\172', '\040', '\061', - '\012', '\145', '\106', '\163', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\147', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\132', '\155', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\154', '\166', '\112', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\131', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\116', '\172', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\112', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\171', '\121', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\160', '\146', '\115', '\040', '\160', '\162', '\040', '\061', - '\012', '\144', '\150', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\155', '\113', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\150', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\107', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\166', '\121', '\040', '\166', '\141', '\040', '\061', - '\012', '\103', '\147', '\161', '\040', '\156', '\147', '\040', '\061', - '\012', '\112', '\146', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\153', '\104', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\144', '\123', '\040', '\144', '\145', '\040', '\061', - '\012', '\111', '\166', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\107', '\153', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\111', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\102', '\172', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\147', '\102', '\142', '\040', '\156', '\147', '\040', '\061', - '\012', '\124', '\160', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\171', '\131', '\040', '\166', '\141', '\040', '\061', - '\012', '\125', '\170', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\153', '\167', '\127', '\040', '\153', '\141', '\040', '\061', - '\012', '\147', '\120', '\146', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\161', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\124', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\172', '\111', '\040', '\163', '\172', '\040', '\061', - '\012', '\131', '\160', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\166', '\104', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\103', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\143', '\121', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\132', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\132', '\170', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\167', '\142', '\101', '\040', '\167', '\141', '\040', '\061', - '\012', '\142', '\124', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\162', '\170', '\122', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\161', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\106', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\160', '\116', '\146', '\040', '\160', '\162', '\040', '\061', - '\012', '\153', '\115', '\166', '\040', '\153', '\141', '\040', '\061', - '\012', '\166', '\125', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\117', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\170', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\161', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\111', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\106', '\172', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\163', '\144', '\040', '\163', '\164', '\040', '\061', - '\012', '\157', '\152', '\131', '\040', '\157', '\156', '\040', '\061', - '\012', '\143', '\105', '\157', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\167', '\122', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\152', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\124', '\160', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\172', '\124', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\146', '\117', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\123', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\116', '\143', '\153', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\167', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\107', '\155', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\111', '\151', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\167', '\105', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\121', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\126', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\131', '\167', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\106', '\170', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\166', '\102', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\131', '\145', '\040', '\154', '\145', '\040', '\061', - '\012', '\147', '\167', '\124', '\040', '\156', '\147', '\040', '\061', - '\012', '\127', '\152', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\110', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\115', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\112', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\126', '\153', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\106', '\170', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\154', '\110', '\166', '\040', '\154', '\145', '\040', '\061', - '\012', '\127', '\160', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\101', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\170', '\102', '\040', '\160', '\162', '\040', '\061', - '\012', '\170', '\165', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\111', '\142', '\040', '\160', '\162', '\040', '\061', - '\012', '\142', '\146', '\105', '\040', '\142', '\145', '\040', '\061', - '\012', '\147', '\122', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\102', '\160', '\142', '\040', '\160', '\162', '\040', '\061', - '\012', '\142', '\170', '\116', '\040', '\142', '\145', '\040', '\061', - '\012', '\153', '\147', '\125', '\040', '\156', '\147', '\040', '\061', - '\012', '\120', '\170', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\103', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\116', '\160', '\142', '\040', '\160', '\162', '\040', '\061', - '\012', '\154', '\170', '\105', '\040', '\154', '\145', '\040', '\061', - '\012', '\154', '\103', '\171', '\040', '\154', '\145', '\040', '\061', - '\012', '\144', '\147', '\130', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\114', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\142', '\121', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\147', '\106', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\170', '\132', '\040', '\160', '\162', '\040', '\061', - '\012', '\160', '\120', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\151', '\131', '\172', '\040', '\151', '\156', '\040', '\061', - '\012', '\166', '\112', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\153', '\124', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\126', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\167', '\123', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\124', '\144', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\121', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\105', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\160', '\120', '\040', '\160', '\162', '\040', '\061', - '\012', '\161', '\152', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\117', '\171', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\155', '\143', '\117', '\040', '\143', '\150', '\040', '\061', - '\012', '\126', '\152', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\144', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\114', '\146', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\166', '\132', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\156', '\117', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\152', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\113', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\147', '\125', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\147', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\115', '\166', '\040', '\144', '\145', '\040', '\061', - '\012', '\130', '\143', '\160', '\040', '\143', '\150', '\040', '\061', - '\012', '\106', '\167', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\167', '\101', '\040', '\160', '\162', '\040', '\061', - '\012', '\114', '\160', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\153', '\120', '\040', '\153', '\141', '\040', '\061', - '\012', '\166', '\110', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\112', '\152', '\171', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\103', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\166', '\115', '\040', '\166', '\141', '\040', '\061', - '\012', '\111', '\143', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\146', '\112', '\040', '\153', '\141', '\040', '\061', - '\012', '\150', '\163', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\127', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\125', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\114', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\152', '\116', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\147', '\121', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\114', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\161', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\155', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\132', '\152', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\132', '\153', '\160', '\040', '\153', '\141', '\040', '\061', - '\012', '\151', '\171', '\110', '\040', '\151', '\156', '\040', '\061', - '\012', '\167', '\165', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\172', '\124', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\167', '\113', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\103', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\171', '\144', '\107', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\144', '\125', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\124', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\154', '\110', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\171', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\154', '\126', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\171', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\127', '\156', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\115', '\172', '\040', '\145', '\162', '\040', '\061', - '\012', '\160', '\130', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\130', '\142', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\153', '\110', '\155', '\040', '\153', '\141', '\040', '\061', - '\012', '\143', '\126', '\144', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\172', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\144', '\116', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\115', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\152', '\123', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\155', '\103', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\111', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\146', '\160', '\115', '\040', '\160', '\162', '\040', '\061', - '\012', '\154', '\143', '\132', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\110', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\112', '\152', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\154', '\107', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\143', '\113', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\121', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\166', '\111', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\167', '\102', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\167', '\143', '\111', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\112', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\121', '\142', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\102', '\152', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\144', '\160', '\131', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\143', '\106', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\123', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\151', '\130', '\152', '\040', '\151', '\156', '\040', '\061', - '\012', '\121', '\147', '\142', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\104', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\170', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\143', '\121', '\040', '\143', '\150', '\040', '\061', - '\012', '\123', '\161', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\155', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\143', '\125', '\040', '\143', '\150', '\040', '\061', - '\012', '\102', '\166', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\172', '\105', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\164', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\142', '\114', '\040', '\166', '\141', '\040', '\061', - '\012', '\142', '\103', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\160', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\155', '\130', '\163', '\040', '\155', '\145', '\040', '\061', - '\012', '\132', '\161', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\153', '\171', '\040', '\153', '\141', '\040', '\061', - '\012', '\130', '\155', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\114', '\156', '\172', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\131', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\122', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\147', '\155', '\113', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\167', '\120', '\040', '\166', '\141', '\040', '\061', - '\012', '\145', '\106', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\116', '\152', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\153', '\154', '\107', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\142', '\105', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\127', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\160', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\132', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\122', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\130', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\151', '\171', '\104', '\040', '\151', '\156', '\040', '\061', - '\012', '\146', '\166', '\114', '\040', '\166', '\141', '\040', '\061', - '\012', '\162', '\120', '\167', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\144', '\122', '\040', '\144', '\145', '\040', '\061', - '\012', '\151', '\123', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\142', '\121', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\170', '\121', '\040', '\170', '\145', '\040', '\061', - '\012', '\104', '\152', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\147', '\113', '\040', '\156', '\147', '\040', '\061', - '\012', '\122', '\150', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\147', '\107', '\040', '\156', '\147', '\040', '\061', - '\012', '\131', '\153', '\171', '\040', '\153', '\141', '\040', '\061', - '\012', '\103', '\170', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\127', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\154', '\155', '\131', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\162', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\167', '\113', '\040', '\167', '\141', '\040', '\061', - '\012', '\170', '\161', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\124', '\167', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\130', '\147', '\161', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\167', '\132', '\040', '\144', '\145', '\040', '\061', - '\012', '\156', '\121', '\154', '\040', '\141', '\156', '\040', '\061', - '\012', '\107', '\150', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\156', '\110', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\155', '\125', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\161', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\152', '\102', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\172', '\123', '\040', '\156', '\147', '\040', '\061', - '\012', '\122', '\167', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\131', '\162', '\040', '\156', '\147', '\040', '\061', - '\012', '\106', '\147', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\144', '\113', '\040', '\144', '\145', '\040', '\061', - '\012', '\150', '\170', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\125', '\170', '\040', '\170', '\145', '\040', '\061', - '\012', '\167', '\155', '\124', '\040', '\155', '\145', '\040', '\061', - '\012', '\171', '\131', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\143', '\104', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\126', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\123', '\147', '\166', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\120', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\131', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\142', '\172', '\105', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\150', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\116', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\164', '\123', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\150', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\114', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\114', '\146', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\147', '\126', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\153', '\123', '\040', '\156', '\147', '\040', '\061', - '\012', '\112', '\161', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\127', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\147', '\117', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\147', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\120', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\127', '\170', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\147', '\161', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\103', '\146', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\167', '\157', '\125', '\040', '\157', '\156', '\040', '\061', - '\012', '\171', '\143', '\112', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\167', '\104', '\040', '\153', '\141', '\040', '\061', - '\012', '\123', '\142', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\161', '\143', '\167', '\040', '\143', '\150', '\040', '\061', - '\012', '\110', '\167', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\142', '\155', '\114', '\040', '\155', '\145', '\040', '\061', - '\012', '\147', '\167', '\132', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\113', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\130', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\151', '\113', '\170', '\040', '\151', '\156', '\040', '\061', - '\012', '\154', '\122', '\172', '\040', '\154', '\145', '\040', '\061', - '\012', '\143', '\110', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\106', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\112', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\155', '\111', '\040', '\155', '\145', '\040', '\061', - '\012', '\143', '\103', '\144', '\040', '\143', '\150', '\040', '\061', - '\012', '\151', '\131', '\144', '\040', '\151', '\156', '\040', '\061', - '\012', '\171', '\146', '\131', '\040', '\156', '\171', '\040', '\061', - '\012', '\170', '\142', '\131', '\040', '\142', '\145', '\040', '\061', - '\012', '\142', '\155', '\105', '\040', '\155', '\145', '\040', '\061', - '\012', '\146', '\102', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\144', '\110', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\143', '\122', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\166', '\114', '\040', '\166', '\141', '\040', '\061', - '\012', '\162', '\152', '\114', '\040', '\145', '\162', '\040', '\061', - '\012', '\163', '\131', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\127', '\160', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\170', '\102', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\102', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\144', '\112', '\040', '\156', '\147', '\040', '\061', - '\012', '\131', '\152', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\146', '\160', '\121', '\040', '\160', '\162', '\040', '\061', - '\012', '\161', '\117', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\152', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\143', '\124', '\040', '\143', '\150', '\040', '\061', - '\012', '\114', '\146', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\106', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\115', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\123', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\167', '\121', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\104', '\171', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\162', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\131', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\126', '\156', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\110', '\143', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\144', '\125', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\166', '\120', '\040', '\166', '\141', '\040', '\061', - '\012', '\131', '\146', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\121', '\153', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\110', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\126', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\153', '\126', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\160', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\106', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\127', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\160', '\131', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\116', '\166', '\040', '\144', '\145', '\040', '\061', - '\012', '\127', '\167', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\106', '\155', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\155', '\104', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\115', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\132', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\152', '\116', '\160', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\150', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\142', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\154', '\113', '\170', '\040', '\154', '\145', '\040', '\061', - '\012', '\151', '\132', '\170', '\040', '\151', '\156', '\040', '\061', - '\012', '\163', '\152', '\124', '\040', '\163', '\172', '\040', '\061', - '\012', '\151', '\152', '\131', '\040', '\151', '\156', '\040', '\061', - '\012', '\161', '\164', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\124', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\110', '\160', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\151', '\107', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\161', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\147', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\106', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\117', '\161', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\130', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\132', '\142', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\113', '\155', '\040', '\154', '\145', '\040', '\061', - '\012', '\123', '\166', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\113', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\126', '\155', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\155', '\111', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\147', '\113', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\124', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\146', '\103', '\040', '\146', '\157', '\040', '\061', - '\012', '\150', '\113', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\123', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\157', '\113', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\156', '\121', '\163', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\151', '\107', '\040', '\151', '\156', '\040', '\061', - '\012', '\161', '\147', '\115', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\121', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\103', '\152', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\120', '\171', '\040', '\151', '\152', '\040', '\061', - '\012', '\130', '\161', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\120', '\172', '\171', '\040', '\163', '\172', '\040', '\061', - '\012', '\106', '\164', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\143', '\105', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\153', '\114', '\040', '\153', '\141', '\040', '\061', - '\012', '\110', '\172', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\124', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\130', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\155', '\115', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\126', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\124', '\161', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\127', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\170', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\121', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\166', '\114', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\120', '\147', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\110', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\170', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\112', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\115', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\111', '\170', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\103', '\171', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\160', '\130', '\146', '\040', '\160', '\162', '\040', '\061', - '\012', '\160', '\114', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\124', '\167', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\104', '\164', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\122', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\165', '\130', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\150', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\111', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\143', '\152', '\114', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\170', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\104', '\155', '\040', '\154', '\145', '\040', '\061', - '\012', '\164', '\130', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\152', '\103', '\040', '\156', '\147', '\040', '\061', - '\012', '\132', '\172', '\144', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\147', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\156', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\113', '\152', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\126', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\142', '\111', '\040', '\142', '\145', '\040', '\061', - '\012', '\132', '\160', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\146', '\117', '\040', '\142', '\145', '\040', '\061', - '\012', '\155', '\123', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\141', '\106', '\040', '\141', '\156', '\040', '\061', - '\012', '\141', '\121', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\152', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\130', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\161', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\166', '\122', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\123', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\144', '\126', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\124', '\146', '\040', '\160', '\162', '\040', '\061', - '\012', '\113', '\172', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\164', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\145', '\147', '\131', '\040', '\156', '\147', '\040', '\061', - '\012', '\122', '\170', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\150', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\107', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\104', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\157', '\131', '\040', '\157', '\156', '\040', '\061', - '\012', '\144', '\113', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\112', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\167', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\111', '\170', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\162', '\115', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\130', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\121', '\171', '\040', '\163', '\172', '\040', '\061', - '\012', '\116', '\160', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\121', '\146', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\162', '\114', '\155', '\040', '\145', '\162', '\040', '\061', - '\012', '\172', '\107', '\155', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\110', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\143', '\131', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\161', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\104', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\147', '\107', '\040', '\156', '\147', '\040', '\061', - '\012', '\104', '\161', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\155', '\117', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\144', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\116', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\162', '\130', '\152', '\040', '\145', '\162', '\040', '\061', - '\012', '\112', '\167', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\104', '\142', '\040', '\155', '\145', '\040', '\061', - '\012', '\167', '\115', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\131', '\152', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\152', '\131', '\040', '\151', '\152', '\040', '\061', - '\012', '\151', '\112', '\142', '\040', '\151', '\156', '\040', '\061', - '\012', '\143', '\144', '\103', '\040', '\143', '\150', '\040', '\061', - '\012', '\131', '\170', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\142', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\106', '\160', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\172', '\150', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\103', '\163', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\130', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\153', '\104', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\165', '\161', '\124', '\040', '\165', '\156', '\040', '\061', - '\012', '\102', '\170', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\102', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\107', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\130', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\171', '\142', '\106', '\040', '\142', '\145', '\040', '\061', - '\012', '\144', '\164', '\101', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\126', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\103', '\142', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\164', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\113', '\144', '\152', '\040', '\144', '\145', '\040', '\061', - '\012', '\153', '\120', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\132', '\166', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\120', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\157', '\110', '\040', '\157', '\156', '\040', '\061', - '\012', '\130', '\160', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\130', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\124', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\167', '\121', '\040', '\153', '\141', '\040', '\061', - '\012', '\153', '\132', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\125', '\161', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\112', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\103', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\115', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\150', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\142', '\102', '\040', '\153', '\141', '\040', '\061', - '\012', '\107', '\160', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\163', '\107', '\172', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\167', '\105', '\040', '\167', '\141', '\040', '\061', - '\012', '\124', '\164', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\107', '\161', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\172', '\116', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\153', '\117', '\040', '\153', '\141', '\040', '\061', - '\012', '\165', '\172', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\170', '\121', '\040', '\157', '\156', '\040', '\061', - '\012', '\126', '\147', '\155', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\155', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\161', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\122', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\124', '\156', '\162', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\152', '\127', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\167', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\164', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\156', '\114', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\104', '\170', '\040', '\156', '\171', '\040', '\061', - '\012', '\170', '\146', '\121', '\040', '\146', '\157', '\040', '\061', - '\012', '\167', '\170', '\112', '\040', '\167', '\141', '\040', '\061', - '\012', '\156', '\170', '\105', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\121', '\156', '\040', '\151', '\156', '\040', '\061', - '\012', '\127', '\153', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\167', '\104', '\040', '\167', '\141', '\040', '\061', - '\012', '\160', '\106', '\146', '\040', '\160', '\162', '\040', '\061', - '\012', '\154', '\142', '\113', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\110', '\171', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\126', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\117', '\161', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\143', '\116', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\127', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\115', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\156', '\167', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\156', '\115', '\040', '\141', '\156', '\040', '\061', - '\012', '\132', '\164', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\121', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\126', '\170', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\125', '\170', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\127', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\171', '\122', '\170', '\040', '\156', '\171', '\040', '\061', - '\012', '\161', '\113', '\165', '\040', '\165', '\156', '\040', '\061', - '\012', '\152', '\130', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\160', '\130', '\040', '\151', '\152', '\040', '\061', - '\012', '\144', '\153', '\107', '\040', '\144', '\145', '\040', '\061', - '\012', '\102', '\156', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\131', '\153', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\147', '\142', '\127', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\154', '\130', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\153', '\110', '\040', '\153', '\141', '\040', '\061', - '\012', '\144', '\113', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\113', '\160', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\161', '\115', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\102', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\162', '\120', '\152', '\040', '\145', '\162', '\040', '\061', - '\012', '\110', '\172', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\131', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\107', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\111', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\125', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\162', '\124', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\161', '\111', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\146', '\120', '\040', '\151', '\152', '\040', '\061', - '\012', '\150', '\122', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\122', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\152', '\152', '\113', '\040', '\151', '\152', '\040', '\061', - '\012', '\164', '\146', '\105', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\163', '\167', '\040', '\163', '\164', '\040', '\061', - '\012', '\106', '\143', '\155', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\112', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\164', '\130', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\122', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\147', '\161', '\105', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\107', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\113', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\130', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\102', '\171', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\124', '\144', '\040', '\154', '\145', '\040', '\061', - '\012', '\127', '\161', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\106', '\164', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\144', '\102', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\156', '\130', '\040', '\141', '\156', '\040', '\061', - '\012', '\102', '\161', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\161', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\144', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\157', '\152', '\112', '\040', '\157', '\156', '\040', '\061', - '\012', '\161', '\132', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\172', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\154', '\121', '\040', '\154', '\145', '\040', '\061', - '\012', '\132', '\142', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\155', '\166', '\114', '\040', '\166', '\141', '\040', '\061', - '\012', '\114', '\152', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\107', '\161', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\146', '\105', '\040', '\155', '\145', '\040', '\061', - '\012', '\170', '\121', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\114', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\114', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\102', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\125', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\144', '\114', '\040', '\144', '\145', '\040', '\061', - '\012', '\155', '\112', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\144', '\170', '\125', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\161', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\160', '\107', '\040', '\160', '\162', '\040', '\061', - '\012', '\164', '\154', '\117', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\150', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\104', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\122', '\161', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\166', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\152', '\131', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\162', '\121', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\171', '\131', '\040', '\156', '\171', '\040', '\061', - '\012', '\171', '\150', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\131', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\114', '\155', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\112', '\163', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\142', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\141', '\120', '\142', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\167', '\112', '\040', '\144', '\145', '\040', '\061', - '\012', '\130', '\171', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\165', '\143', '\112', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\124', '\146', '\040', '\144', '\145', '\040', '\061', - '\012', '\154', '\102', '\142', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\113', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\143', '\122', '\040', '\143', '\150', '\040', '\061', - '\012', '\145', '\121', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\131', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\126', '\164', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\103', '\143', '\147', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\101', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\170', '\112', '\040', '\156', '\147', '\040', '\061', - '\012', '\165', '\166', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\102', '\150', '\155', '\040', '\155', '\141', '\040', '\061', - '\012', '\132', '\147', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\172', '\112', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\166', '\112', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\124', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\144', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\167', '\107', '\040', '\166', '\141', '\040', '\061', - '\012', '\131', '\155', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\157', '\131', '\167', '\040', '\157', '\156', '\040', '\061', - '\012', '\152', '\130', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\167', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\166', '\126', '\170', '\040', '\166', '\151', '\040', '\061', - '\012', '\122', '\167', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\104', '\166', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\113', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\114', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\171', '\166', '\040', '\166', '\151', '\040', '\061', - '\012', '\103', '\161', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\122', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\121', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\161', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\132', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\161', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\142', '\117', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\126', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\154', '\155', '\040', '\154', '\145', '\040', '\061', - '\012', '\165', '\132', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\120', '\160', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\126', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\126', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\112', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\131', '\172', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\103', '\166', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\167', '\123', '\040', '\160', '\162', '\040', '\061', - '\012', '\113', '\153', '\167', '\040', '\153', '\141', '\040', '\061', - '\012', '\127', '\166', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\106', '\144', '\171', '\040', '\144', '\145', '\040', '\061', - '\012', '\160', '\160', '\130', '\040', '\160', '\162', '\040', '\061', - '\012', '\150', '\166', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\167', '\107', '\040', '\151', '\156', '\040', '\061', - '\012', '\162', '\102', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\102', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\131', '\163', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\143', '\117', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\105', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\142', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\121', '\163', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\166', '\103', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\153', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\151', '\167', '\040', '\151', '\156', '\040', '\061', - '\012', '\107', '\164', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\101', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\126', '\171', '\040', '\167', '\141', '\040', '\061', - '\012', '\142', '\170', '\124', '\040', '\142', '\145', '\040', '\061', - '\012', '\121', '\150', '\163', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\154', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\142', '\101', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\146', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\170', '\127', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\145', '\126', '\040', '\145', '\162', '\040', '\061', - '\012', '\162', '\161', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\161', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\113', '\166', '\040', '\151', '\152', '\040', '\061', - '\012', '\151', '\124', '\146', '\040', '\151', '\156', '\040', '\061', - '\012', '\153', '\167', '\125', '\040', '\153', '\141', '\040', '\061', - '\012', '\151', '\106', '\161', '\040', '\151', '\156', '\040', '\061', - '\012', '\155', '\152', '\132', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\147', '\112', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\114', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\163', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\104', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\144', '\106', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\170', '\116', '\040', '\167', '\141', '\040', '\061', - '\012', '\167', '\107', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\144', '\125', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\112', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\103', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\104', '\150', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\111', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\141', '\121', '\155', '\040', '\141', '\156', '\040', '\061', - '\012', '\131', '\172', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\166', '\110', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\142', '\152', '\126', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\123', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\161', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\162', '\127', '\040', '\145', '\162', '\040', '\061', - '\012', '\110', '\172', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\127', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\115', '\153', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\147', '\106', '\040', '\156', '\147', '\040', '\061', - '\012', '\103', '\156', '\153', '\040', '\141', '\156', '\040', '\061', - '\012', '\162', '\104', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\172', '\102', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\117', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\165', '\126', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\146', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\115', '\150', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\131', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\153', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\131', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\164', '\161', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\160', '\142', '\040', '\160', '\162', '\040', '\061', - '\012', '\142', '\107', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\170', '\106', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\167', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\113', '\147', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\111', '\161', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\112', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\121', '\153', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\126', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\124', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\132', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\104', '\172', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\146', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\141', '\146', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\121', '\167', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\144', '\112', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\124', '\165', '\040', '\165', '\156', '\040', '\061', - '\012', '\125', '\143', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\110', '\156', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\110', '\142', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\171', '\110', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\124', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\170', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\144', '\123', '\040', '\144', '\145', '\040', '\061', - '\012', '\127', '\147', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\157', '\161', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\162', '\146', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\131', '\171', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\115', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\113', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\110', '\171', '\170', '\040', '\156', '\171', '\040', '\061', - '\012', '\115', '\170', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\110', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\146', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\147', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\155', '\117', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\172', '\123', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\167', '\121', '\040', '\151', '\152', '\040', '\061', - '\012', '\106', '\150', '\143', '\040', '\151', '\143', '\040', '\061', - '\012', '\170', '\111', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\146', '\110', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\161', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\106', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\121', '\144', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\150', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\103', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\110', '\147', '\162', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\161', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\147', '\123', '\040', '\156', '\147', '\040', '\061', - '\012', '\116', '\161', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\121', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\121', '\172', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\111', '\170', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\103', '\170', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\155', '\170', '\116', '\040', '\155', '\145', '\040', '\061', - '\012', '\166', '\121', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\143', '\101', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\145', '\103', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\155', '\161', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\161', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\126', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\161', '\157', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\170', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\172', '\130', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\130', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\121', '\164', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\157', '\150', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\131', '\147', '\171', '\040', '\156', '\147', '\040', '\061', - '\012', '\130', '\156', '\142', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\127', '\155', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\130', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\127', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\113', '\155', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\166', '\110', '\040', '\166', '\141', '\040', '\061', - '\012', '\125', '\145', '\167', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\112', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\110', '\153', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\155', '\120', '\040', '\155', '\145', '\040', '\061', - '\012', '\163', '\154', '\122', '\040', '\151', '\163', '\040', '\061', - '\012', '\125', '\141', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\142', '\107', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\116', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\143', '\126', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\107', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\151', '\167', '\125', '\040', '\151', '\156', '\040', '\061', - '\012', '\103', '\156', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\162', '\130', '\144', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\127', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\107', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\142', '\131', '\040', '\142', '\145', '\040', '\061', - '\012', '\150', '\172', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\127', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\115', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\152', '\172', '\127', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\114', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\132', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\110', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\126', '\167', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\166', '\164', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\145', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\170', '\107', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\121', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\107', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\166', '\101', '\040', '\143', '\150', '\040', '\061', - '\012', '\157', '\124', '\155', '\040', '\157', '\156', '\040', '\061', - '\012', '\160', '\152', '\131', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\125', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\152', '\167', '\125', '\040', '\151', '\152', '\040', '\061', - '\012', '\112', '\147', '\155', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\146', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\145', '\117', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\102', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\102', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\123', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\171', '\120', '\040', '\151', '\152', '\040', '\061', - '\012', '\106', '\153', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\152', '\123', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\164', '\101', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\155', '\146', '\040', '\155', '\145', '\040', '\061', - '\012', '\131', '\164', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\120', '\161', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\167', '\112', '\040', '\167', '\141', '\040', '\061', - '\012', '\157', '\127', '\146', '\040', '\157', '\156', '\040', '\061', - '\012', '\153', '\170', '\112', '\040', '\153', '\141', '\040', '\061', - '\012', '\152', '\110', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\143', '\120', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\102', '\163', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\153', '\113', '\040', '\153', '\141', '\040', '\061', - '\012', '\166', '\144', '\121', '\040', '\144', '\145', '\040', '\061', - '\012', '\160', '\152', '\132', '\040', '\151', '\152', '\040', '\061', - '\012', '\126', '\147', '\146', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\166', '\107', '\040', '\163', '\164', '\040', '\061', - '\012', '\153', '\107', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\127', '\152', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\121', '\155', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\107', '\154', '\166', '\040', '\154', '\145', '\040', '\061', - '\012', '\164', '\155', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\154', '\131', '\040', '\154', '\145', '\040', '\061', - '\012', '\120', '\143', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\121', '\167', '\040', '\167', '\151', '\040', '\061', - '\012', '\170', '\141', '\117', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\146', '\116', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\107', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\166', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\167', '\101', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\155', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\166', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\102', '\160', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\112', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\155', '\132', '\040', '\166', '\141', '\040', '\061', - '\012', '\156', '\112', '\160', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\161', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\110', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\121', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\107', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\121', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\102', '\160', '\040', '\155', '\145', '\040', '\061', - '\012', '\164', '\160', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\153', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\165', '\125', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\144', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\146', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\114', '\166', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\151', '\130', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\117', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\150', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\115', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\106', '\163', '\167', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\101', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\167', '\112', '\040', '\167', '\141', '\040', '\061', - '\012', '\146', '\120', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\104', '\146', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\132', '\142', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\102', '\147', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\121', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\153', '\121', '\160', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\157', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\125', '\161', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\131', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\163', '\104', '\146', '\040', '\163', '\164', '\040', '\061', - '\012', '\170', '\165', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\122', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\121', '\163', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\124', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\121', '\170', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\110', '\166', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\132', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\104', '\165', '\040', '\165', '\156', '\040', '\061', - '\012', '\146', '\170', '\101', '\040', '\146', '\157', '\040', '\061', - '\012', '\170', '\120', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\167', '\130', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\112', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\144', '\113', '\040', '\144', '\145', '\040', '\061', - '\012', '\147', '\160', '\127', '\040', '\156', '\147', '\040', '\061', - '\012', '\121', '\147', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\170', '\107', '\040', '\153', '\141', '\040', '\061', - '\012', '\144', '\114', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\102', '\167', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\126', '\144', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\121', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\163', '\170', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\123', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\125', '\153', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\120', '\152', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\162', '\106', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\152', '\120', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\127', '\166', '\040', '\153', '\141', '\040', '\061', - '\012', '\113', '\150', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\107', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\156', '\104', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\131', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\147', '\122', '\040', '\156', '\147', '\040', '\061', - '\012', '\162', '\152', '\103', '\040', '\145', '\162', '\040', '\061', - '\012', '\130', '\152', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\153', '\172', '\105', '\040', '\163', '\172', '\040', '\061', - '\012', '\121', '\147', '\161', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\147', '\142', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\150', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\153', '\117', '\040', '\153', '\141', '\040', '\061', - '\012', '\165', '\167', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\120', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\130', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\147', '\101', '\157', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\166', '\107', '\040', '\153', '\141', '\040', '\061', - '\012', '\166', '\143', '\130', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\117', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\130', '\172', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\106', '\155', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\107', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\152', '\122', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\153', '\111', '\040', '\153', '\165', '\040', '\061', - '\012', '\160', '\161', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\156', '\110', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\150', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\144', '\122', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\104', '\146', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\111', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\103', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\122', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\113', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\111', '\165', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\161', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\105', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\146', '\117', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\165', '\112', '\040', '\165', '\156', '\040', '\061', - '\012', '\156', '\122', '\160', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\170', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\146', '\132', '\040', '\156', '\171', '\040', '\061', - '\012', '\157', '\161', '\124', '\040', '\150', '\157', '\040', '\061', - '\012', '\143', '\147', '\130', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\142', '\114', '\040', '\160', '\162', '\040', '\061', - '\012', '\130', '\155', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\126', '\152', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\171', '\154', '\131', '\040', '\154', '\145', '\040', '\061', - '\012', '\144', '\146', '\113', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\147', '\104', '\040', '\156', '\147', '\040', '\061', - '\012', '\165', '\167', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\120', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\103', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\160', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\161', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\112', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\172', '\121', '\040', '\154', '\145', '\040', '\061', - '\012', '\146', '\147', '\115', '\040', '\156', '\147', '\040', '\061', - '\012', '\131', '\154', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\124', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\122', '\152', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\122', '\147', '\152', '\040', '\152', '\157', '\040', '\061', - '\012', '\107', '\153', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\170', '\107', '\040', '\146', '\157', '\040', '\061', - '\012', '\155', '\164', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\147', '\112', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\144', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\110', '\153', '\040', '\151', '\156', '\040', '\061', - '\012', '\107', '\161', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\104', '\152', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\172', '\132', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\106', '\160', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\124', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\164', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\142', '\124', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\166', '\113', '\040', '\144', '\145', '\040', '\061', - '\012', '\103', '\164', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\144', '\107', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\113', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\103', '\154', '\146', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\162', '\125', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\155', '\124', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\130', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\172', '\117', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\130', '\156', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\162', '\172', '\121', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\121', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\160', '\124', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\131', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\114', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\130', '\147', '\144', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\132', '\154', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\106', '\171', '\040', '\154', '\145', '\040', '\061', - '\012', '\132', '\156', '\147', '\040', '\141', '\156', '\040', '\061', - '\012', '\141', '\130', '\147', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\142', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\143', '\131', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\161', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\102', '\154', '\170', '\040', '\154', '\145', '\040', '\061', - '\012', '\157', '\161', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\120', '\166', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\132', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\144', '\132', '\040', '\144', '\145', '\040', '\061', - '\012', '\102', '\161', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\160', '\107', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\144', '\120', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\165', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\142', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\150', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\167', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\153', '\117', '\040', '\153', '\157', '\040', '\061', - '\012', '\147', '\163', '\131', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\107', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\153', '\166', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\160', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\162', '\167', '\113', '\040', '\145', '\162', '\040', '\061', - '\012', '\114', '\150', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\165', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\161', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\143', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\127', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\143', '\156', '\106', '\040', '\141', '\156', '\040', '\061', - '\012', '\154', '\127', '\167', '\040', '\154', '\145', '\040', '\061', - '\012', '\164', '\170', '\123', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\156', '\105', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\124', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\154', '\106', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\144', '\112', '\040', '\144', '\145', '\040', '\061', - '\012', '\145', '\126', '\153', '\040', '\145', '\162', '\040', '\061', - '\012', '\172', '\152', '\132', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\120', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\161', '\121', '\040', '\143', '\150', '\040', '\061', - '\012', '\120', '\143', '\147', '\040', '\143', '\150', '\040', '\061', - '\012', '\131', '\144', '\153', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\166', '\105', '\040', '\163', '\164', '\040', '\061', - '\012', '\127', '\161', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\143', '\126', '\040', '\143', '\150', '\040', '\061', - '\012', '\156', '\110', '\170', '\040', '\157', '\156', '\040', '\061', - '\012', '\167', '\101', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\150', '\146', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\141', '\115', '\166', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\167', '\117', '\040', '\160', '\162', '\040', '\061', - '\012', '\131', '\167', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\143', '\142', '\110', '\040', '\143', '\150', '\040', '\061', - '\012', '\157', '\152', '\132', '\040', '\157', '\156', '\040', '\061', - '\012', '\163', '\165', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\143', '\125', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\161', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\115', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\160', '\170', '\107', '\040', '\160', '\162', '\040', '\061', - '\012', '\162', '\102', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\154', '\131', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\171', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\103', '\166', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\124', '\161', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\123', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\126', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\105', '\161', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\156', '\104', '\040', '\141', '\156', '\040', '\061', - '\012', '\117', '\167', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\170', '\124', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\167', '\152', '\114', '\040', '\151', '\152', '\040', '\061', - '\012', '\122', '\170', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\156', '\127', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\110', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\102', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\116', '\161', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\172', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\167', '\123', '\040', '\167', '\141', '\040', '\061', - '\012', '\103', '\142', '\171', '\040', '\142', '\145', '\040', '\061', - '\012', '\172', '\122', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\167', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\156', '\102', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\111', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\107', '\153', '\040', '\143', '\150', '\040', '\061', - '\012', '\131', '\152', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\147', '\126', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\104', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\121', '\171', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\143', '\110', '\040', '\143', '\150', '\040', '\061', - '\012', '\156', '\170', '\102', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\166', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\147', '\121', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\162', '\122', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\156', '\113', '\040', '\141', '\156', '\040', '\061', - '\012', '\110', '\154', '\162', '\040', '\154', '\145', '\040', '\061', - '\012', '\104', '\156', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\156', '\125', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\103', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\124', '\152', '\166', '\040', '\151', '\152', '\040', '\061', - '\012', '\105', '\160', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\114', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\160', '\132', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\166', '\122', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\161', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\154', '\107', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\166', '\116', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\142', '\115', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\116', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\152', '\172', '\114', '\040', '\163', '\172', '\040', '\061', - '\012', '\127', '\154', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\141', '\131', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\144', '\131', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\146', '\107', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\146', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\102', '\166', '\040', '\153', '\141', '\040', '\061', - '\012', '\142', '\164', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\115', '\161', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\162', '\103', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\165', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\171', '\112', '\040', '\156', '\171', '\040', '\061', - '\012', '\161', '\155', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\153', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\103', '\155', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\130', '\171', '\040', '\142', '\145', '\040', '\061', - '\012', '\131', '\155', '\171', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\170', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\116', '\154', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\172', '\125', '\040', '\146', '\157', '\040', '\061', - '\012', '\122', '\166', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\154', '\111', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\115', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\121', '\150', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\110', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\167', '\114', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\131', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\121', '\170', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\116', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\116', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\155', '\120', '\040', '\151', '\152', '\040', '\061', - '\012', '\120', '\142', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\161', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\125', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\110', '\171', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\144', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\123', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\143', '\127', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\153', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\132', '\164', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\125', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\102', '\155', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\112', '\171', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\144', '\111', '\040', '\144', '\145', '\040', '\061', - '\012', '\156', '\124', '\144', '\040', '\141', '\156', '\040', '\061', - '\012', '\131', '\152', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\121', '\152', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\130', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\167', '\102', '\040', '\157', '\167', '\040', '\061', - '\012', '\153', '\154', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\146', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\104', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\132', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\155', '\161', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\132', '\162', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\155', '\131', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\114', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\121', '\143', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\113', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\161', '\104', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\113', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\142', '\146', '\122', '\040', '\142', '\145', '\040', '\061', - '\012', '\122', '\161', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\150', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\116', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\124', '\143', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\110', '\142', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\114', '\167', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\143', '\132', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\144', '\113', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\160', '\122', '\040', '\160', '\162', '\040', '\061', - '\012', '\154', '\127', '\155', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\116', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\101', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\162', '\126', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\155', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\114', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\151', '\167', '\102', '\040', '\151', '\156', '\040', '\061', - '\012', '\145', '\161', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\161', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\156', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\165', '\157', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\126', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\142', '\125', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\160', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\144', '\132', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\172', '\127', '\040', '\144', '\145', '\040', '\061', - '\012', '\127', '\146', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\132', '\161', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\112', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\127', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\131', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\162', '\152', '\121', '\040', '\145', '\162', '\040', '\061', - '\012', '\144', '\167', '\102', '\040', '\144', '\145', '\040', '\061', - '\012', '\126', '\154', '\170', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\113', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\114', '\170', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\110', '\160', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\155', '\166', '\122', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\115', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\127', '\142', '\040', '\160', '\162', '\040', '\061', - '\012', '\144', '\143', '\127', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\105', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\162', '\163', '\040', '\145', '\162', '\040', '\061', - '\012', '\106', '\164', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\171', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\123', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\127', '\172', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\120', '\172', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\153', '\127', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\167', '\131', '\040', '\167', '\141', '\040', '\061', - '\012', '\157', '\107', '\142', '\040', '\157', '\156', '\040', '\061', - '\012', '\152', '\102', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\121', '\160', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\162', '\127', '\155', '\040', '\145', '\162', '\040', '\061', - '\012', '\163', '\155', '\121', '\040', '\163', '\164', '\040', '\061', - '\012', '\165', '\107', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\153', '\126', '\040', '\153', '\141', '\040', '\061', - '\012', '\167', '\112', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\143', '\152', '\127', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\116', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\167', '\152', '\122', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\104', '\144', '\040', '\167', '\141', '\040', '\061', - '\012', '\154', '\162', '\102', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\150', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\113', '\160', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\116', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\161', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\155', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\112', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\162', '\116', '\040', '\145', '\162', '\040', '\061', - '\012', '\165', '\102', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\125', '\165', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\115', '\172', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\104', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\147', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\144', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\106', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\152', '\125', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\162', '\130', '\040', '\145', '\162', '\040', '\061', - '\012', '\113', '\166', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\162', '\171', '\131', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\172', '\121', '\040', '\163', '\172', '\040', '\061', - '\012', '\117', '\152', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\146', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\126', '\161', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\141', '\121', '\166', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\110', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\111', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\113', '\160', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\144', '\121', '\153', '\040', '\153', '\157', '\040', '\061', - '\012', '\107', '\150', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\132', '\163', '\040', '\143', '\150', '\040', '\061', - '\012', '\156', '\166', '\110', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\167', '\112', '\040', '\151', '\152', '\040', '\061', - '\012', '\144', '\115', '\155', '\040', '\144', '\145', '\040', '\061', - '\012', '\147', '\152', '\111', '\040', '\156', '\147', '\040', '\061', - '\012', '\154', '\120', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\102', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\150', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\114', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\102', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\143', '\165', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\121', '\144', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\160', '\130', '\040', '\160', '\162', '\040', '\061', - '\012', '\155', '\121', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\155', '\122', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\146', '\110', '\040', '\146', '\157', '\040', '\061', - '\012', '\160', '\161', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\164', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\143', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\127', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\120', '\170', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\121', '\155', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\155', '\144', '\130', '\040', '\144', '\145', '\040', '\061', - '\012', '\102', '\170', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\132', '\166', '\040', '\151', '\152', '\040', '\061', - '\012', '\150', '\116', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\142', '\116', '\040', '\142', '\145', '\040', '\061', - '\012', '\142', '\153', '\132', '\040', '\153', '\141', '\040', '\061', - '\012', '\156', '\126', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\154', '\113', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\112', '\152', '\040', '\157', '\156', '\040', '\061', - '\012', '\160', '\102', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\147', '\101', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\170', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\166', '\112', '\040', '\141', '\156', '\040', '\061', - '\012', '\130', '\143', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\106', '\144', '\142', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\101', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\167', '\121', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\164', '\155', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\166', '\132', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\116', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\172', '\113', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\122', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\124', '\154', '\152', '\040', '\154', '\145', '\040', '\061', - '\012', '\151', '\121', '\152', '\040', '\151', '\156', '\040', '\061', - '\012', '\152', '\155', '\125', '\040', '\151', '\152', '\040', '\061', - '\012', '\164', '\142', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\126', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\124', '\166', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\126', '\147', '\040', '\141', '\156', '\040', '\061', - '\012', '\114', '\170', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\166', '\147', '\117', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\146', '\105', '\040', '\144', '\145', '\040', '\061', - '\012', '\156', '\126', '\155', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\113', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\145', '\161', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\124', '\143', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\124', '\153', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\113', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\127', '\153', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\166', '\132', '\040', '\154', '\145', '\040', '\061', - '\012', '\162', '\107', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\153', '\113', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\103', '\142', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\152', '\121', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\132', '\146', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\166', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\147', '\116', '\040', '\156', '\147', '\040', '\061', - '\012', '\113', '\160', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\172', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\170', '\132', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\161', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\147', '\103', '\040', '\156', '\147', '\040', '\061', - '\012', '\106', '\161', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\115', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\152', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\146', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\152', '\116', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\116', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\120', '\172', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\155', '\150', '\117', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\125', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\106', '\150', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\123', '\152', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\150', '\127', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\150', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\107', '\160', '\040', '\154', '\145', '\040', '\061', - '\012', '\144', '\164', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\167', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\162', '\113', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\161', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\143', '\117', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\121', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\121', '\161', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\112', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\130', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\165', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\156', '\160', '\040', '\141', '\156', '\040', '\061', - '\012', '\104', '\154', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\115', '\170', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\171', '\116', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\142', '\155', '\126', '\040', '\155', '\145', '\040', '\061', - '\012', '\146', '\130', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\155', '\167', '\127', '\040', '\155', '\145', '\040', '\061', - '\012', '\154', '\111', '\152', '\040', '\154', '\145', '\040', '\061', - '\012', '\106', '\166', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\125', '\164', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\107', '\153', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\131', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\167', '\126', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\142', '\124', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\111', '\152', '\160', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\156', '\115', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\155', '\117', '\040', '\155', '\145', '\040', '\061', - '\012', '\147', '\121', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\113', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\125', '\146', '\040', '\144', '\145', '\040', '\061', - '\012', '\143', '\123', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\126', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\143', '\131', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\152', '\105', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\131', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\162', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\172', '\113', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\146', '\103', '\040', '\163', '\172', '\040', '\061', - '\012', '\131', '\142', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\147', '\123', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\143', '\126', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\116', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\130', '\153', '\167', '\040', '\153', '\141', '\040', '\061', - '\012', '\124', '\160', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\102', '\167', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\150', '\167', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\121', '\154', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\104', '\163', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\131', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\124', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\161', '\127', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\152', '\124', '\040', '\151', '\152', '\040', '\061', - '\012', '\150', '\152', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\104', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\150', '\123', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\127', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\103', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\171', '\102', '\040', '\151', '\152', '\040', '\061', - '\012', '\165', '\127', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\116', '\156', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\166', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\172', '\126', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\102', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\111', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\122', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\162', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\132', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\153', '\122', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\116', '\172', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\121', '\146', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\116', '\152', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\106', '\171', '\040', '\142', '\145', '\040', '\061', - '\012', '\154', '\150', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\145', '\127', '\152', '\040', '\145', '\162', '\040', '\061', - '\012', '\152', '\142', '\115', '\040', '\151', '\152', '\040', '\061', - '\012', '\130', '\163', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\122', '\163', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\154', '\106', '\040', '\154', '\145', '\040', '\061', - '\012', '\120', '\150', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\127', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\142', '\103', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\147', '\146', '\112', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\126', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\145', '\121', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\143', '\120', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\104', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\124', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\147', '\163', '\040', '\156', '\147', '\040', '\061', - '\012', '\126', '\165', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\146', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\102', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\160', '\124', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\123', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\142', '\104', '\040', '\155', '\145', '\040', '\061', - '\012', '\126', '\167', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\150', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\146', '\120', '\040', '\153', '\141', '\040', '\061', - '\012', '\120', '\167', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\150', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\132', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\122', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\103', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\152', '\116', '\040', '\151', '\152', '\040', '\061', - '\012', '\122', '\161', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\112', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\154', '\122', '\040', '\154', '\145', '\040', '\061', - '\012', '\130', '\155', '\142', '\040', '\155', '\145', '\040', '\061', - '\012', '\112', '\152', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\161', '\111', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\161', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\151', '\126', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\110', '\147', '\165', '\040', '\156', '\147', '\040', '\061', - '\012', '\151', '\110', '\167', '\040', '\151', '\156', '\040', '\061', - '\012', '\145', '\121', '\166', '\040', '\145', '\162', '\040', '\061', - '\012', '\155', '\172', '\105', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\152', '\132', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\116', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\154', '\105', '\040', '\154', '\145', '\040', '\061', - '\012', '\153', '\107', '\160', '\040', '\153', '\141', '\040', '\061', - '\012', '\111', '\161', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\102', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\132', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\104', '\153', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\154', '\110', '\040', '\154', '\145', '\040', '\061', - '\012', '\164', '\170', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\121', '\162', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\117', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\112', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\172', '\142', '\114', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\153', '\104', '\040', '\153', '\141', '\040', '\061', - '\012', '\163', '\143', '\126', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\130', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\111', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\116', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\112', '\146', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\155', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\143', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\167', '\132', '\040', '\153', '\141', '\040', '\061', - '\012', '\165', '\132', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\156', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\165', '\113', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\162', '\130', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\130', '\171', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\143', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\120', '\146', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\167', '\115', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\111', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\165', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\104', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\110', '\152', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\144', '\121', '\146', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\166', '\112', '\040', '\167', '\141', '\040', '\061', - '\012', '\164', '\110', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\131', '\144', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\170', '\111', '\040', '\167', '\141', '\040', '\061', - '\012', '\160', '\117', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\127', '\155', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\150', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\160', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\155', '\103', '\040', '\155', '\145', '\040', '\061', - '\012', '\167', '\143', '\130', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\152', '\110', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\127', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\107', '\144', '\160', '\040', '\144', '\145', '\040', '\061', - '\012', '\114', '\144', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\123', '\142', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\132', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\113', '\167', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\150', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\122', '\146', '\040', '\156', '\171', '\040', '\061', - '\012', '\150', '\167', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\160', '\112', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\155', '\126', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\107', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\161', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\120', '\150', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\127', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\126', '\170', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\163', '\110', '\172', '\040', '\163', '\164', '\040', '\061', - '\012', '\127', '\142', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\142', '\146', '\113', '\040', '\142', '\145', '\040', '\061', - '\012', '\112', '\147', '\154', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\124', '\142', '\040', '\153', '\141', '\040', '\061', - '\012', '\113', '\142', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\153', '\172', '\103', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\113', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\167', '\102', '\040', '\163', '\172', '\040', '\061', - '\012', '\165', '\132', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\164', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\130', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\165', '\172', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\127', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\162', '\110', '\040', '\145', '\162', '\040', '\061', - '\012', '\157', '\121', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\154', '\124', '\040', '\154', '\145', '\040', '\061', - '\012', '\144', '\146', '\111', '\040', '\144', '\145', '\040', '\061', - '\012', '\121', '\155', '\146', '\040', '\155', '\145', '\040', '\061', - '\012', '\163', '\147', '\105', '\040', '\156', '\147', '\040', '\061', - '\012', '\131', '\163', '\170', '\040', '\163', '\164', '\040', '\061', - '\012', '\122', '\172', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\114', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\163', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\161', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\103', '\155', '\040', '\153', '\141', '\040', '\061', - '\012', '\142', '\106', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\151', '\147', '\121', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\122', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\107', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\123', '\172', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\131', '\166', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\153', '\130', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\107', '\156', '\172', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\127', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\104', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\161', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\156', '\110', '\142', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\144', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\117', '\166', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\132', '\156', '\154', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\165', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\114', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\157', '\146', '\121', '\040', '\157', '\156', '\040', '\061', - '\012', '\166', '\131', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\171', '\110', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\161', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\112', '\171', '\040', '\143', '\150', '\040', '\061', - '\012', '\127', '\142', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\154', '\124', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\154', '\127', '\040', '\154', '\145', '\040', '\061', - '\012', '\130', '\170', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\103', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\113', '\146', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\167', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\110', '\153', '\040', '\145', '\162', '\040', '\061', - '\012', '\144', '\142', '\116', '\040', '\144', '\145', '\040', '\061', - '\012', '\165', '\125', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\147', '\116', '\040', '\156', '\147', '\040', '\061', - '\012', '\120', '\170', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\116', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\171', '\112', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\160', '\110', '\040', '\151', '\152', '\040', '\061', - '\012', '\126', '\164', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\152', '\112', '\040', '\163', '\164', '\040', '\061', - '\012', '\121', '\154', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\167', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\107', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\126', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\163', '\121', '\040', '\163', '\164', '\040', '\061', - '\012', '\170', '\156', '\124', '\040', '\141', '\156', '\040', '\061', - '\012', '\162', '\160', '\112', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\172', '\111', '\040', '\163', '\172', '\040', '\061', - '\012', '\132', '\150', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\141', '\104', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\125', '\170', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\120', '\147', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\123', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\113', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\102', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\120', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\126', '\153', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\151', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\153', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\117', '\165', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\157', '\110', '\040', '\157', '\156', '\040', '\061', - '\012', '\161', '\126', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\107', '\170', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\152', '\172', '\106', '\040', '\163', '\172', '\040', '\061', - '\012', '\163', '\167', '\110', '\040', '\163', '\164', '\040', '\061', - '\012', '\156', '\102', '\142', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\150', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\122', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\156', '\130', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\157', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\170', '\120', '\040', '\155', '\145', '\040', '\061', - '\012', '\142', '\167', '\122', '\040', '\167', '\141', '\040', '\061', - '\012', '\147', '\112', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\156', '\153', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\115', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\170', '\117', '\040', '\144', '\145', '\040', '\061', - '\012', '\162', '\172', '\126', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\160', '\120', '\040', '\166', '\141', '\040', '\061', - '\012', '\116', '\166', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\116', '\146', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\103', '\156', '\172', '\040', '\141', '\156', '\040', '\061', - '\012', '\157', '\124', '\144', '\040', '\157', '\156', '\040', '\061', - '\012', '\144', '\161', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\110', '\155', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\160', '\163', '\130', '\040', '\163', '\164', '\040', '\061', - '\012', '\163', '\167', '\115', '\040', '\163', '\164', '\040', '\061', - '\012', '\144', '\161', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\167', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\156', '\130', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\153', '\131', '\040', '\153', '\141', '\040', '\061', - '\012', '\167', '\146', '\103', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\123', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\126', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\104', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\131', '\166', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\161', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\170', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\113', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\143', '\116', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\127', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\122', '\162', '\172', '\040', '\145', '\162', '\040', '\061', - '\012', '\142', '\155', '\107', '\040', '\155', '\145', '\040', '\061', - '\012', '\163', '\162', '\132', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\127', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\103', '\146', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\116', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\143', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\156', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\112', '\150', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\111', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\123', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\145', '\125', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\111', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\132', '\155', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\145', '\107', '\146', '\040', '\145', '\162', '\040', '\061', - '\012', '\142', '\121', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\130', '\143', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\156', '\154', '\113', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\155', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\154', '\114', '\040', '\154', '\145', '\040', '\061', - '\012', '\155', '\167', '\103', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\152', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\102', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\150', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\120', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\102', '\146', '\040', '\163', '\164', '\040', '\061', - '\012', '\165', '\130', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\153', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\162', '\107', '\172', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\130', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\165', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\166', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\142', '\143', '\112', '\040', '\143', '\150', '\040', '\061', - '\012', '\105', '\157', '\152', '\040', '\157', '\156', '\040', '\061', - '\012', '\151', '\126', '\164', '\040', '\151', '\156', '\040', '\061', - '\012', '\171', '\150', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\126', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\115', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\132', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\126', '\166', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\151', '\103', '\166', '\040', '\151', '\156', '\040', '\061', - '\012', '\166', '\121', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\154', '\102', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\126', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\125', '\147', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\164', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\103', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\166', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\126', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\162', '\120', '\166', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\146', '\110', '\040', '\167', '\141', '\040', '\061', - '\012', '\150', '\142', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\152', '\106', '\040', '\151', '\152', '\040', '\061', - '\012', '\157', '\130', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\123', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\122', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\110', '\143', '\165', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\170', '\112', '\040', '\156', '\171', '\040', '\061', - '\012', '\154', '\124', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\131', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\127', '\170', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\162', '\105', '\040', '\145', '\162', '\040', '\061', - '\012', '\172', '\107', '\171', '\040', '\163', '\172', '\040', '\061', - '\012', '\112', '\161', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\172', '\111', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\147', '\126', '\040', '\147', '\151', '\040', '\061', - '\012', '\122', '\166', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\126', '\156', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\165', '\112', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\106', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\124', '\147', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\141', '\121', '\143', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\172', '\112', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\116', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\146', '\101', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\143', '\117', '\040', '\143', '\150', '\040', '\061', - '\012', '\127', '\153', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\102', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\150', '\147', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\123', '\170', '\040', '\151', '\156', '\040', '\061', - '\012', '\170', '\103', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\171', '\152', '\130', '\040', '\151', '\152', '\040', '\061', - '\012', '\165', '\111', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\147', '\161', '\040', '\156', '\147', '\040', '\061', - '\012', '\124', '\172', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\152', '\117', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\162', '\131', '\040', '\145', '\162', '\040', '\061', - '\012', '\142', '\155', '\132', '\040', '\155', '\145', '\040', '\061', - '\012', '\172', '\161', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\102', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\166', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\143', '\101', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\162', '\130', '\040', '\145', '\162', '\040', '\061', - '\012', '\155', '\112', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\130', '\161', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\120', '\170', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\141', '\104', '\142', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\130', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\145', '\107', '\167', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\152', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\124', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\157', '\115', '\144', '\040', '\157', '\156', '\040', '\061', - '\012', '\146', '\113', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\116', '\160', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\161', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\142', '\106', '\040', '\154', '\145', '\040', '\061', - '\012', '\110', '\166', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\132', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\121', '\152', '\040', '\154', '\145', '\040', '\061', - '\012', '\144', '\153', '\131', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\132', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\132', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\171', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\155', '\112', '\040', '\144', '\145', '\040', '\061', - '\012', '\153', '\146', '\113', '\040', '\153', '\141', '\040', '\061', - '\012', '\151', '\120', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\167', '\125', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\166', '\123', '\040', '\166', '\141', '\040', '\061', - '\012', '\151', '\150', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\143', '\127', '\040', '\143', '\150', '\040', '\061', - '\012', '\112', '\152', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\155', '\115', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\160', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\103', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\113', '\163', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\154', '\111', '\040', '\154', '\145', '\040', '\061', - '\012', '\116', '\155', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\172', '\126', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\132', '\163', '\040', '\156', '\147', '\040', '\061', - '\012', '\162', '\122', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\125', '\146', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\160', '\106', '\040', '\160', '\162', '\040', '\061', - '\012', '\146', '\167', '\131', '\040', '\167', '\141', '\040', '\061', - '\012', '\107', '\170', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\114', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\172', '\105', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\122', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\162', '\122', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\153', '\132', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\125', '\171', '\040', '\144', '\145', '\040', '\061', - '\012', '\130', '\152', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\113', '\144', '\142', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\160', '\103', '\040', '\151', '\152', '\040', '\061', - '\012', '\157', '\125', '\152', '\040', '\157', '\156', '\040', '\061', - '\012', '\161', '\155', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\152', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\122', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\150', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\122', '\150', '\162', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\164', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\120', '\152', '\161', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\167', '\125', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\171', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\170', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\120', '\161', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\122', '\144', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\161', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\106', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\115', '\167', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\152', '\105', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\116', '\170', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\120', '\172', '\155', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\146', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\106', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\121', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\102', '\156', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\154', '\115', '\166', '\040', '\154', '\145', '\040', '\061', - '\012', '\164', '\113', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\145', '\126', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\124', '\171', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\162', '\112', '\040', '\145', '\162', '\040', '\061', - '\012', '\157', '\110', '\167', '\040', '\157', '\156', '\040', '\061', - '\012', '\154', '\106', '\153', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\160', '\127', '\040', '\151', '\152', '\040', '\061', - '\012', '\121', '\152', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\116', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\102', '\150', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\150', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\104', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\170', '\160', '\131', '\040', '\160', '\162', '\040', '\061', - '\012', '\164', '\156', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\146', '\114', '\040', '\144', '\145', '\040', '\061', - '\012', '\150', '\172', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\116', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\102', '\155', '\040', '\154', '\145', '\040', '\061', - '\012', '\154', '\130', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\171', '\120', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\132', '\143', '\154', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\115', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\112', '\152', '\040', '\162', '\151', '\040', '\061', - '\012', '\141', '\130', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\163', '\121', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\121', '\155', '\040', '\143', '\150', '\040', '\061', - '\012', '\123', '\161', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\113', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\166', '\117', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\107', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\142', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\103', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\154', '\107', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\104', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\104', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\122', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\166', '\130', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\161', '\151', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\106', '\163', '\040', '\143', '\150', '\040', '\061', - '\012', '\114', '\150', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\105', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\146', '\121', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\112', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\172', '\117', '\040', '\154', '\145', '\040', '\061', - '\012', '\106', '\170', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\164', '\104', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\156', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\170', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\107', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\166', '\107', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\160', '\103', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\170', '\104', '\040', '\160', '\162', '\040', '\061', - '\012', '\132', '\146', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\157', '\127', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\166', '\126', '\040', '\166', '\141', '\040', '\061', - '\012', '\107', '\167', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\131', '\143', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\143', '\132', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\115', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\171', '\121', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\165', '\107', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\116', '\152', '\040', '\154', '\145', '\040', '\061', - '\012', '\131', '\143', '\155', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\111', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\171', '\114', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\155', '\122', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\156', '\162', '\113', '\040', '\141', '\156', '\040', '\061', - '\012', '\132', '\171', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\116', '\143', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\155', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\120', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\127', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\105', '\147', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\116', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\163', '\116', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\160', '\144', '\127', '\040', '\144', '\145', '\040', '\061', - '\012', '\123', '\156', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\162', '\120', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\112', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\164', '\126', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\166', '\103', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\150', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\144', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\155', '\124', '\040', '\155', '\145', '\040', '\061', - '\012', '\114', '\142', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\160', '\112', '\040', '\160', '\162', '\040', '\061', - '\012', '\155', '\131', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\167', '\126', '\040', '\167', '\141', '\040', '\061', - '\012', '\167', '\152', '\104', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\161', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\125', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\144', '\150', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\132', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\164', '\167', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\142', '\115', '\040', '\142', '\145', '\040', '\061', - '\012', '\150', '\147', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\113', '\142', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\112', '\155', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\105', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\117', '\146', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\130', '\154', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\160', '\126', '\040', '\160', '\162', '\040', '\061', - '\012', '\164', '\161', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\125', '\146', '\040', '\160', '\162', '\040', '\061', - '\012', '\124', '\167', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\115', '\147', '\161', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\121', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\171', '\152', '\124', '\040', '\151', '\152', '\040', '\061', - '\012', '\141', '\126', '\144', '\040', '\141', '\156', '\040', '\061', - '\012', '\145', '\110', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\107', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\163', '\162', '\107', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\126', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\154', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\162', '\124', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\122', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\114', '\162', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\162', '\110', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\124', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\143', '\166', '\111', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\161', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\111', '\170', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\170', '\145', '\121', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\116', '\171', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\122', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\165', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\143', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\113', '\172', '\142', '\040', '\142', '\151', '\040', '\061', - '\012', '\127', '\170', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\152', '\115', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\144', '\117', '\040', '\144', '\145', '\040', '\061', - '\012', '\112', '\146', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\142', '\126', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\121', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\156', '\143', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\126', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\123', '\170', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\125', '\142', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\167', '\166', '\103', '\040', '\166', '\141', '\040', '\061', - '\012', '\153', '\150', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\161', '\106', '\040', '\143', '\150', '\040', '\061', - '\012', '\116', '\170', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\104', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\171', '\104', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\151', '\171', '\111', '\040', '\151', '\156', '\040', '\061', - '\012', '\145', '\130', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\161', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\113', '\170', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\163', '\131', '\040', '\163', '\164', '\040', '\061', - '\012', '\124', '\167', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\146', '\161', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\155', '\103', '\040', '\155', '\145', '\040', '\061', - '\012', '\166', '\106', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\156', '\103', '\040', '\141', '\156', '\040', '\061', - '\012', '\156', '\127', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\172', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\113', '\146', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\164', '\121', '\145', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\165', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\154', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\107', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\117', '\161', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\116', '\160', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\150', '\147', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\170', '\115', '\040', '\146', '\157', '\040', '\061', - '\012', '\152', '\123', '\171', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\112', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\152', '\107', '\040', '\151', '\152', '\040', '\061', - '\012', '\164', '\147', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\117', '\147', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\110', '\142', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\114', '\152', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\151', '\166', '\132', '\040', '\151', '\156', '\040', '\061', - '\012', '\142', '\155', '\131', '\040', '\155', '\145', '\040', '\061', - '\012', '\121', '\146', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\167', '\146', '\121', '\040', '\167', '\141', '\040', '\061', - '\012', '\150', '\103', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\165', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\144', '\132', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\126', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\155', '\132', '\146', '\040', '\155', '\145', '\040', '\061', - '\012', '\154', '\117', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\111', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\132', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\170', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\155', '\171', '\040', '\155', '\145', '\040', '\061', - '\012', '\112', '\161', '\151', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\170', '\114', '\040', '\143', '\150', '\040', '\061', - '\012', '\132', '\164', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\144', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\127', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\107', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\127', '\167', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\160', '\102', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\171', '\161', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\131', '\154', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\156', '\127', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\171', '\112', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\107', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\116', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\150', '\106', '\163', '\040', '\164', '\150', '\040', '\061', - '\012', '\131', '\170', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\166', '\112', '\040', '\153', '\141', '\040', '\061', - '\012', '\106', '\170', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\167', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\166', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\122', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\121', '\161', '\151', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\172', '\105', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\116', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\160', '\127', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\143', '\120', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\120', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\143', '\121', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\121', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\171', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\143', '\130', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\155', '\131', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\154', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\105', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\161', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\117', '\150', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\144', '\115', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\114', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\161', '\101', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\167', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\114', '\172', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\161', '\117', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\130', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\113', '\144', '\163', '\040', '\144', '\145', '\040', '\061', - '\012', '\147', '\166', '\125', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\120', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\156', '\132', '\162', '\040', '\141', '\156', '\040', '\061', - '\012', '\110', '\170', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\103', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\146', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\146', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\146', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\161', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\165', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\146', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\154', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\152', '\104', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\164', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\155', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\127', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\121', '\170', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\126', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\155', '\132', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\144', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\161', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\130', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\155', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\146', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\121', '\162', '\040', '\143', '\150', '\040', '\061', - '\012', '\131', '\150', '\162', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\166', '\123', '\040', '\166', '\141', '\040', '\061', - '\012', '\165', '\104', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\144', '\102', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\166', '\105', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\166', '\123', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\122', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\166', '\104', '\040', '\145', '\162', '\040', '\061', - '\012', '\130', '\171', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\112', '\146', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\141', '\102', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\156', '\127', '\143', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\102', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\147', '\131', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\107', '\142', '\040', '\142', '\151', '\040', '\061', - '\012', '\147', '\152', '\105', '\040', '\156', '\147', '\040', '\061', - '\012', '\122', '\154', '\167', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\162', '\124', '\040', '\145', '\162', '\040', '\061', - '\012', '\142', '\121', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\154', '\152', '\131', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\166', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\113', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\160', '\124', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\124', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\156', '\126', '\040', '\141', '\156', '\040', '\061', - '\012', '\162', '\127', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\156', '\127', '\144', '\040', '\141', '\156', '\040', '\061', - '\012', '\156', '\113', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\115', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\153', '\107', '\040', '\153', '\141', '\040', '\061', - '\012', '\142', '\167', '\130', '\040', '\167', '\141', '\040', '\061', - '\012', '\143', '\167', '\126', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\167', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\114', '\166', '\040', '\145', '\162', '\040', '\061', - '\012', '\172', '\115', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\160', '\132', '\040', '\163', '\172', '\040', '\061', - '\012', '\162', '\115', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\124', '\164', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\166', '\117', '\040', '\156', '\147', '\040', '\061', - '\012', '\112', '\143', '\172', '\040', '\143', '\150', '\040', '\061', - '\012', '\103', '\171', '\170', '\040', '\156', '\171', '\040', '\061', - '\012', '\156', '\152', '\130', '\040', '\141', '\156', '\040', '\061', - '\012', '\141', '\126', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\130', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\125', '\161', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\126', '\172', '\040', '\144', '\145', '\040', '\061', - '\012', '\122', '\143', '\160', '\040', '\143', '\150', '\040', '\061', - '\012', '\145', '\113', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\130', '\172', '\156', '\040', '\151', '\156', '\040', '\061', - '\012', '\166', '\171', '\106', '\040', '\166', '\141', '\040', '\061', - '\012', '\113', '\154', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\144', '\111', '\040', '\144', '\145', '\040', '\061', - '\012', '\110', '\161', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\105', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\160', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\104', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\112', '\150', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\165', '\113', '\040', '\165', '\156', '\040', '\061', - '\012', '\166', '\147', '\125', '\040', '\156', '\147', '\040', '\061', - '\012', '\162', '\127', '\166', '\040', '\145', '\162', '\040', '\061', - '\012', '\120', '\156', '\155', '\040', '\141', '\156', '\040', '\061', - '\012', '\156', '\114', '\155', '\040', '\141', '\156', '\040', '\061', - '\012', '\102', '\150', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\120', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\160', '\111', '\040', '\151', '\152', '\040', '\061', - '\012', '\164', '\114', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\160', '\123', '\040', '\166', '\141', '\040', '\061', - '\012', '\106', '\170', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\104', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\172', '\115', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\167', '\112', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\102', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\107', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\114', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\102', '\152', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\146', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\154', '\127', '\040', '\143', '\150', '\040', '\061', - '\012', '\122', '\147', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\107', '\163', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\125', '\166', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\121', '\147', '\166', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\146', '\130', '\040', '\156', '\147', '\040', '\061', - '\012', '\162', '\121', '\166', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\166', '\107', '\040', '\166', '\141', '\040', '\061', - '\012', '\153', '\152', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\144', '\107', '\146', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\143', '\101', '\040', '\143', '\150', '\040', '\061', - '\012', '\105', '\150', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\102', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\107', '\160', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\164', '\102', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\146', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\112', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\163', '\161', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\162', '\131', '\040', '\145', '\162', '\040', '\061', - '\012', '\104', '\161', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\172', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\115', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\146', '\115', '\040', '\156', '\171', '\040', '\061', - '\012', '\107', '\170', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\167', '\172', '\120', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\116', '\155', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\113', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\122', '\162', '\144', '\040', '\145', '\162', '\040', '\061', - '\012', '\110', '\166', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\146', '\104', '\040', '\156', '\147', '\040', '\061', - '\012', '\127', '\155', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\112', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\156', '\124', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\165', '\166', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\120', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\167', '\122', '\040', '\166', '\141', '\040', '\061', - '\012', '\142', '\115', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\167', '\111', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\170', '\131', '\040', '\153', '\141', '\040', '\061', - '\012', '\147', '\132', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\106', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\115', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\110', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\126', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\154', '\130', '\040', '\154', '\145', '\040', '\061', - '\012', '\146', '\163', '\114', '\040', '\163', '\164', '\040', '\061', - '\012', '\160', '\122', '\146', '\040', '\160', '\162', '\040', '\061', - '\012', '\172', '\163', '\130', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\102', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\172', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\144', '\122', '\040', '\144', '\145', '\040', '\061', - '\012', '\132', '\154', '\172', '\040', '\154', '\145', '\040', '\061', - '\012', '\127', '\146', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\122', '\152', '\166', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\106', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\153', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\142', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\170', '\121', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\113', '\170', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\170', '\103', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\156', '\161', '\126', '\040', '\141', '\156', '\040', '\061', - '\012', '\127', '\167', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\153', '\144', '\127', '\040', '\144', '\145', '\040', '\061', - '\012', '\160', '\153', '\111', '\040', '\153', '\141', '\040', '\061', - '\012', '\157', '\150', '\123', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\144', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\103', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\170', '\114', '\040', '\163', '\164', '\040', '\061', - '\012', '\121', '\162', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\130', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\161', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\151', '\152', '\113', '\040', '\151', '\156', '\040', '\061', - '\012', '\163', '\106', '\172', '\040', '\163', '\164', '\040', '\061', - '\012', '\110', '\154', '\167', '\040', '\154', '\145', '\040', '\061', - '\012', '\107', '\161', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\120', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\167', '\132', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\161', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\172', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\102', '\144', '\172', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\121', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\164', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\125', '\171', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\127', '\143', '\171', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\161', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\102', '\156', '\163', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\104', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\112', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\127', '\146', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\150', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\127', '\160', '\040', '\143', '\150', '\040', '\061', - '\012', '\162', '\161', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\153', '\102', '\040', '\153', '\141', '\040', '\061', - '\012', '\127', '\164', '\154', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\172', '\146', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\115', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\160', '\170', '\116', '\040', '\160', '\162', '\040', '\061', - '\012', '\166', '\150', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\161', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\113', '\144', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\121', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\171', '\153', '\103', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\115', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\105', '\161', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\130', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\155', '\132', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\160', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\107', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\124', '\152', '\170', '\040', '\172', '\152', '\040', '\061', - '\012', '\164', '\166', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\131', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\106', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\151', '\112', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\120', '\153', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\143', '\104', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\131', '\171', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\126', '\143', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\150', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\116', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\143', '\104', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\156', '\127', '\040', '\141', '\156', '\040', '\061', - '\012', '\165', '\166', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\172', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\120', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\167', '\104', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\160', '\117', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\104', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\166', '\105', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\132', '\143', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\162', '\130', '\040', '\145', '\162', '\040', '\061', - '\012', '\144', '\150', '\123', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\152', '\112', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\104', '\153', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\162', '\112', '\040', '\145', '\162', '\040', '\061', - '\012', '\141', '\127', '\147', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\166', '\112', '\040', '\166', '\141', '\040', '\061', - '\012', '\131', '\164', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\151', '\121', '\040', '\151', '\156', '\040', '\061', - '\012', '\164', '\106', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\112', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\132', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\125', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\157', '\161', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\104', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\146', '\105', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\123', '\142', '\040', '\155', '\145', '\040', '\061', - '\012', '\152', '\155', '\122', '\040', '\151', '\152', '\040', '\061', - '\012', '\162', '\106', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\130', '\152', '\171', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\120', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\151', '\161', '\121', '\040', '\164', '\151', '\040', '\061', - '\012', '\155', '\146', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\170', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\102', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\130', '\166', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\166', '\131', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\144', '\115', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\147', '\131', '\040', '\156', '\147', '\040', '\061', - '\012', '\162', '\131', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\154', '\101', '\040', '\154', '\145', '\040', '\061', - '\012', '\160', '\106', '\142', '\040', '\160', '\162', '\040', '\061', - '\012', '\171', '\106', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\143', '\113', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\146', '\132', '\040', '\146', '\157', '\040', '\061', - '\012', '\152', '\104', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\116', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\164', '\113', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\164', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\110', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\103', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\143', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\104', '\167', '\040', '\153', '\141', '\040', '\061', - '\012', '\131', '\167', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\130', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\171', '\115', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\107', '\167', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\131', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\103', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\152', '\132', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\157', '\121', '\144', '\040', '\157', '\156', '\040', '\061', - '\012', '\106', '\172', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\167', '\106', '\040', '\154', '\145', '\040', '\061', - '\012', '\130', '\172', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\116', '\152', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\157', '\111', '\040', '\157', '\156', '\040', '\061', - '\012', '\163', '\112', '\155', '\040', '\163', '\164', '\040', '\061', - '\012', '\167', '\113', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\121', '\164', '\150', '\040', '\143', '\150', '\040', '\061', - '\012', '\114', '\154', '\172', '\040', '\154', '\145', '\040', '\061', - '\012', '\147', '\126', '\146', '\040', '\147', '\151', '\040', '\061', - '\012', '\160', '\120', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\107', '\171', '\040', '\154', '\145', '\040', '\061', - '\012', '\147', '\172', '\122', '\040', '\156', '\147', '\040', '\061', - '\012', '\162', '\130', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\116', '\160', '\146', '\040', '\160', '\162', '\040', '\061', - '\012', '\167', '\166', '\122', '\040', '\166', '\141', '\040', '\061', - '\012', '\171', '\130', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\155', '\115', '\154', '\040', '\154', '\151', '\040', '\061', - '\012', '\142', '\131', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\146', '\172', '\132', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\162', '\107', '\040', '\145', '\162', '\040', '\061', - '\012', '\113', '\144', '\153', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\161', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\153', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\113', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\132', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\120', '\146', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\162', '\154', '\127', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\120', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\117', '\152', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\107', '\164', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\164', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\154', '\171', '\040', '\154', '\145', '\040', '\061', - '\012', '\171', '\110', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\153', '\121', '\142', '\040', '\153', '\141', '\040', '\061', - '\012', '\114', '\144', '\143', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\125', '\170', '\040', '\163', '\164', '\040', '\061', - '\012', '\143', '\112', '\147', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\114', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\115', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\103', '\152', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\141', '\167', '\130', '\040', '\141', '\156', '\040', '\061', - '\012', '\107', '\164', '\154', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\172', '\116', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\101', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\145', '\172', '\130', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\102', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\163', '\130', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\125', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\163', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\163', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\172', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\121', '\147', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\116', '\170', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\110', '\161', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\162', '\130', '\154', '\040', '\145', '\162', '\040', '\061', - '\012', '\156', '\154', '\120', '\040', '\141', '\156', '\040', '\061', - '\012', '\141', '\126', '\147', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\150', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\146', '\101', '\040', '\153', '\141', '\040', '\061', - '\012', '\126', '\155', '\153', '\040', '\155', '\107', '\040', '\061', - '\012', '\152', '\113', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\150', '\120', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\141', '\120', '\144', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\131', '\171', '\040', '\142', '\145', '\040', '\061', - '\012', '\142', '\156', '\132', '\040', '\141', '\156', '\040', '\061', - '\012', '\107', '\163', '\152', '\040', '\163', '\164', '\040', '\061', - '\012', '\153', '\170', '\121', '\040', '\153', '\141', '\040', '\061', - '\012', '\166', '\153', '\106', '\040', '\153', '\141', '\040', '\061', - '\012', '\152', '\172', '\123', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\127', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\121', '\143', '\165', '\040', '\143', '\150', '\040', '\061', - '\012', '\162', '\132', '\146', '\040', '\145', '\162', '\040', '\061', - '\012', '\152', '\142', '\132', '\040', '\151', '\152', '\040', '\061', - '\012', '\141', '\121', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\172', '\117', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\132', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\162', '\116', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\153', '\114', '\040', '\153', '\141', '\040', '\061', - '\012', '\104', '\161', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\153', '\103', '\040', '\163', '\172', '\040', '\061', - '\012', '\163', '\114', '\167', '\040', '\163', '\164', '\040', '\061', - '\012', '\116', '\166', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\116', '\142', '\171', '\040', '\142', '\145', '\040', '\061', - '\012', '\145', '\115', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\106', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\103', '\170', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\151', '\132', '\160', '\040', '\151', '\156', '\040', '\061', - '\012', '\144', '\166', '\132', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\111', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\103', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\120', '\172', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\166', '\116', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\161', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\155', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\170', '\126', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\154', '\104', '\040', '\156', '\147', '\040', '\061', - '\012', '\107', '\142', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\112', '\166', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\106', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\115', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\153', '\112', '\040', '\153', '\141', '\040', '\061', - '\012', '\123', '\170', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\141', '\146', '\125', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\110', '\142', '\040', '\155', '\145', '\040', '\061', - '\012', '\152', '\170', '\125', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\112', '\154', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\161', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\116', '\161', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\107', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\172', '\107', '\040', '\143', '\150', '\040', '\061', - '\012', '\113', '\146', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\127', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\130', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\146', '\156', '\104', '\040', '\141', '\156', '\040', '\061', - '\012', '\112', '\162', '\144', '\040', '\145', '\162', '\040', '\061', - '\012', '\157', '\170', '\132', '\040', '\157', '\156', '\040', '\061', - '\012', '\150', '\130', '\156', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\161', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\101', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\151', '\107', '\153', '\040', '\151', '\156', '\040', '\061', - '\012', '\170', '\105', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\146', '\126', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\164', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\150', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\157', '\121', '\172', '\040', '\157', '\156', '\040', '\061', - '\012', '\160', '\147', '\117', '\040', '\156', '\147', '\040', '\061', - '\012', '\131', '\161', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\112', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\153', '\143', '\126', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\156', '\115', '\040', '\141', '\156', '\040', '\061', - '\012', '\103', '\167', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\127', '\147', '\144', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\160', '\124', '\040', '\160', '\162', '\040', '\061', - '\012', '\112', '\144', '\152', '\040', '\144', '\145', '\040', '\061', - '\012', '\116', '\142', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\167', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\145', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\113', '\144', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\121', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\120', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\127', '\160', '\040', '\154', '\145', '\040', '\061', - '\012', '\106', '\142', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\126', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\154', '\111', '\040', '\154', '\145', '\040', '\061', - '\012', '\102', '\172', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\146', '\113', '\040', '\151', '\152', '\040', '\061', - '\012', '\131', '\166', '\155', '\040', '\166', '\141', '\040', '\061', - '\012', '\106', '\164', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\141', '\115', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\172', '\126', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\117', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\110', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\127', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\106', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\104', '\166', '\040', '\163', '\164', '\040', '\061', - '\012', '\166', '\155', '\104', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\152', '\114', '\040', '\151', '\152', '\040', '\061', - '\012', '\151', '\102', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\161', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\163', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\170', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\152', '\163', '\107', '\040', '\163', '\164', '\040', '\061', - '\012', '\143', '\130', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\131', '\142', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\145', '\112', '\040', '\145', '\162', '\040', '\061', - '\012', '\157', '\120', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\130', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\166', '\114', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\143', '\106', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\106', '\142', '\040', '\153', '\141', '\040', '\061', - '\012', '\152', '\130', '\166', '\040', '\151', '\152', '\040', '\061', - '\012', '\101', '\157', '\170', '\040', '\157', '\156', '\040', '\061', - '\012', '\172', '\153', '\121', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\120', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\106', '\166', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\142', '\130', '\040', '\142', '\145', '\040', '\061', - '\012', '\157', '\103', '\146', '\040', '\157', '\156', '\040', '\061', - '\012', '\131', '\152', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\120', '\160', '\146', '\040', '\160', '\162', '\040', '\061', - '\012', '\116', '\152', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\143', '\132', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\156', '\107', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\167', '\112', '\040', '\143', '\155', '\040', '\061', - '\012', '\161', '\112', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\116', '\146', '\040', '\156', '\147', '\040', '\061', - '\012', '\124', '\146', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\167', '\113', '\040', '\166', '\141', '\040', '\061', - '\012', '\132', '\143', '\163', '\040', '\143', '\150', '\040', '\061', - '\012', '\145', '\102', '\166', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\114', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\161', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\162', '\104', '\040', '\143', '\150', '\040', '\061', - '\012', '\111', '\143', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\102', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\172', '\130', '\040', '\156', '\147', '\040', '\061', - '\012', '\165', '\152', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\170', '\125', '\040', '\166', '\141', '\040', '\061', - '\012', '\153', '\132', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\114', '\144', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\146', '\115', '\040', '\142', '\145', '\040', '\061', - '\012', '\155', '\121', '\155', '\040', '\121', '\117', '\040', '\061', - '\012', '\172', '\154', '\121', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\142', '\125', '\040', '\151', '\152', '\040', '\061', - '\012', '\113', '\166', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\125', '\170', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\160', '\152', '\123', '\040', '\151', '\152', '\040', '\061', - '\012', '\130', '\166', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\153', '\152', '\111', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\131', '\151', '\040', '\143', '\150', '\040', '\061', - '\012', '\156', '\112', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\121', '\170', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\141', '\116', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\112', '\146', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\142', '\116', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\144', '\121', '\040', '\144', '\145', '\040', '\061', - '\012', '\102', '\172', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\132', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\143', '\160', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\107', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\153', '\103', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\147', '\167', '\120', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\142', '\126', '\040', '\167', '\141', '\040', '\061', - '\012', '\105', '\161', '\164', '\040', '\145', '\161', '\040', '\061', - '\012', '\130', '\150', '\156', '\040', '\164', '\150', '\040', '\061', - '\012', '\157', '\125', '\146', '\040', '\157', '\156', '\040', '\061', - '\012', '\144', '\113', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\170', '\116', '\040', '\163', '\164', '\040', '\061', - '\012', '\117', '\146', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\103', '\160', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\150', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\147', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\156', '\125', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\152', '\124', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\163', '\132', '\040', '\163', '\164', '\040', '\061', - '\012', '\154', '\107', '\166', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\115', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\165', '\153', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\150', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\122', '\167', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\122', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\167', '\113', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\112', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\164', '\126', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\161', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\151', '\131', '\154', '\040', '\151', '\156', '\040', '\061', - '\012', '\170', '\114', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\130', '\144', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\143', '\117', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\154', '\115', '\040', '\154', '\145', '\040', '\061', - '\012', '\142', '\104', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\116', '\155', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\144', '\113', '\166', '\040', '\144', '\145', '\040', '\061', - '\012', '\150', '\120', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\124', '\152', '\171', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\131', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\156', '\146', '\112', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\146', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\112', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\113', '\160', '\040', '\154', '\145', '\040', '\061', - '\012', '\111', '\171', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\165', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\145', '\113', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\163', '\132', '\146', '\040', '\163', '\164', '\040', '\061', - '\012', '\172', '\160', '\121', '\040', '\163', '\172', '\040', '\061', - '\012', '\163', '\146', '\114', '\040', '\163', '\164', '\040', '\061', - '\012', '\155', '\152', '\124', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\130', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\113', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\167', '\126', '\040', '\145', '\162', '\040', '\061', - '\012', '\160', '\152', '\102', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\131', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\131', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\161', '\131', '\040', '\145', '\161', '\040', '\061', - '\012', '\165', '\111', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\124', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\161', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\112', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\107', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\167', '\106', '\040', '\163', '\164', '\040', '\061', - '\012', '\110', '\146', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\110', '\164', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\146', '\127', '\040', '\150', '\127', '\040', '\061', - '\012', '\151', '\171', '\107', '\040', '\151', '\156', '\040', '\061', - '\012', '\172', '\120', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\172', '\126', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\126', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\163', '\120', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\113', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\145', '\106', '\142', '\040', '\145', '\162', '\040', '\061', - '\012', '\121', '\152', '\151', '\040', '\152', '\123', '\040', '\061', - '\012', '\155', '\164', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\147', '\132', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\110', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\124', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\170', '\132', '\040', '\156', '\147', '\040', '\061', - '\012', '\113', '\164', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\127', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\127', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\123', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\106', '\172', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\150', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\160', '\127', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\166', '\120', '\040', '\151', '\152', '\040', '\061', - '\012', '\165', '\131', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\125', '\170', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\123', '\161', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\143', '\112', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\115', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\132', '\147', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\107', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\126', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\125', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\157', '\161', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\107', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\131', '\142', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\122', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\162', '\132', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\124', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\132', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\147', '\117', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\112', '\152', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\120', '\160', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\161', '\167', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\143', '\112', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\106', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\167', '\131', '\040', '\167', '\141', '\040', '\061', - '\012', '\153', '\124', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\107', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\145', '\121', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\107', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\160', '\126', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\124', '\155', '\040', '\166', '\141', '\040', '\061', - '\012', '\117', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\160', '\130', '\040', '\144', '\145', '\040', '\061', - '\012', '\142', '\131', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\164', '\152', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\114', '\172', '\156', '\040', '\114', '\107', '\040', '\061', - '\012', '\131', '\152', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\165', '\131', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\144', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\130', '\163', '\040', '\164', '\150', '\040', '\061', - '\012', '\111', '\167', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\150', '\112', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\124', '\146', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\143', '\170', '\117', '\040', '\143', '\150', '\040', '\061', - '\012', '\121', '\161', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\104', '\166', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\163', '\117', '\040', '\163', '\164', '\040', '\061', - '\012', '\155', '\162', '\107', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\152', '\112', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\147', '\104', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\125', '\167', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\144', '\102', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\154', '\125', '\040', '\154', '\145', '\040', '\061', - '\012', '\142', '\102', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\161', '\142', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\154', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\127', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\147', '\142', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\162', '\125', '\040', '\145', '\162', '\040', '\061', - '\012', '\142', '\147', '\111', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\152', '\112', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\166', '\125', '\040', '\166', '\141', '\040', '\061', - '\012', '\162', '\103', '\160', '\040', '\107', '\103', '\040', '\061', - '\012', '\156', '\126', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\142', '\107', '\040', '\142', '\145', '\040', '\061', - '\012', '\164', '\144', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\152', '\122', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\121', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\172', '\132', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\125', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\152', '\131', '\040', '\151', '\152', '\040', '\061', - '\012', '\112', '\170', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\132', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\166', '\132', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\154', '\122', '\163', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\167', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\160', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\163', '\167', '\123', '\040', '\163', '\164', '\040', '\061', - '\012', '\105', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\105', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\164', '\153', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\147', '\130', '\040', '\156', '\147', '\040', '\061', - '\012', '\122', '\167', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\163', '\152', '\127', '\040', '\163', '\164', '\040', '\061', - '\012', '\144', '\130', '\155', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\166', '\131', '\040', '\166', '\113', '\040', '\061', - '\012', '\154', '\162', '\117', '\040', '\145', '\162', '\040', '\061', - '\012', '\114', '\144', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\143', '\170', '\126', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\106', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\126', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\120', '\171', '\146', '\040', '\156', '\171', '\040', '\061', - '\012', '\113', '\170', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\167', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\160', '\114', '\040', '\143', '\150', '\040', '\061', - '\012', '\110', '\147', '\145', '\040', '\156', '\147', '\040', '\061', - '\012', '\127', '\142', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\121', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\104', '\154', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\160', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\132', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\132', '\161', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\155', '\125', '\040', '\155', '\145', '\040', '\061', - '\012', '\164', '\125', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\127', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\162', '\144', '\040', '\145', '\162', '\040', '\061', - '\012', '\160', '\121', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\162', '\132', '\166', '\040', '\145', '\162', '\040', '\061', - '\012', '\155', '\152', '\111', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\121', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\166', '\107', '\171', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\167', '\131', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\116', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\160', '\120', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\113', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\126', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\164', '\115', '\150', '\040', '\143', '\150', '\040', '\061', - '\012', '\113', '\164', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\160', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\104', '\146', '\040', '\151', '\156', '\040', '\061', - '\012', '\161', '\113', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\114', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\112', '\152', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\143', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\124', '\161', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\107', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\152', '\170', '\126', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\143', '\103', '\040', '\143', '\150', '\040', '\061', - '\012', '\106', '\167', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\120', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\155', '\105', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\155', '\124', '\040', '\155', '\145', '\040', '\061', - '\012', '\154', '\170', '\103', '\040', '\107', '\103', '\040', '\061', - '\012', '\154', '\122', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\121', '\153', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\151', '\150', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\114', '\154', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\113', '\161', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\110', '\150', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\120', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\166', '\121', '\040', '\121', '\117', '\040', '\061', - '\012', '\152', '\107', '\171', '\040', '\151', '\152', '\040', '\061', - '\012', '\154', '\115', '\153', '\040', '\154', '\145', '\040', '\061', - '\012', '\165', '\117', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\144', '\124', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\166', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\143', '\132', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\153', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\142', '\112', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\146', '\113', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\115', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\160', '\106', '\040', '\166', '\141', '\040', '\061', - '\012', '\144', '\147', '\120', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\170', '\106', '\040', '\155', '\145', '\040', '\061', - '\012', '\162', '\132', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\107', '\144', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\120', '\170', '\040', '\163', '\164', '\040', '\061', - '\012', '\162', '\107', '\144', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\142', '\121', '\040', '\156', '\147', '\040', '\061', - '\012', '\104', '\146', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\163', '\152', '\103', '\040', '\163', '\164', '\040', '\061', - '\012', '\172', '\123', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\111', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\111', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\153', '\160', '\106', '\040', '\153', '\141', '\040', '\061', - '\012', '\145', '\125', '\167', '\040', '\145', '\162', '\040', '\061', - '\012', '\110', '\170', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\166', '\107', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\125', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\152', '\106', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\114', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\152', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\114', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\144', '\123', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\167', '\113', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\110', '\171', '\040', '\164', '\150', '\040', '\061', - '\012', '\123', '\163', '\167', '\040', '\163', '\164', '\040', '\061', - '\012', '\150', '\152', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\104', '\144', '\160', '\040', '\144', '\145', '\040', '\061', - '\012', '\142', '\120', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\127', '\160', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\162', '\127', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\160', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\157', '\130', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\152', '\113', '\040', '\151', '\152', '\040', '\061', - '\012', '\126', '\172', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\131', '\144', '\040', '\154', '\145', '\040', '\061', - '\012', '\117', '\144', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\150', '\126', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\122', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\132', '\164', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\126', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\152', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\106', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\114', '\150', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\154', '\117', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\166', '\102', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\142', '\116', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\120', '\155', '\040', '\166', '\141', '\040', '\061', - '\012', '\164', '\121', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\166', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\162', '\161', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\105', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\152', '\163', '\102', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\155', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\164', '\105', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\144', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\104', '\155', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\167', '\111', '\040', '\167', '\141', '\040', '\061', - '\012', '\152', '\160', '\121', '\040', '\151', '\152', '\040', '\061', - '\012', '\165', '\130', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\131', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\157', '\106', '\172', '\040', '\157', '\156', '\040', '\061', - '\012', '\164', '\102', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\103', '\156', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\132', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\162', '\114', '\040', '\145', '\162', '\040', '\061', - '\012', '\112', '\162', '\171', '\040', '\145', '\162', '\040', '\061', - '\012', '\151', '\113', '\144', '\040', '\151', '\156', '\040', '\061', - '\012', '\166', '\143', '\116', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\116', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\156', '\122', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\143', '\110', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\141', '\117', '\040', '\141', '\156', '\040', '\061', - '\012', '\165', '\141', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\170', '\114', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\125', '\146', '\040', '\155', '\145', '\040', '\061', - '\012', '\166', '\117', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\120', '\170', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\165', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\146', '\116', '\040', '\163', '\164', '\040', '\061', - '\012', '\121', '\154', '\166', '\040', '\154', '\145', '\040', '\061', - '\012', '\142', '\132', '\171', '\040', '\142', '\145', '\040', '\061', - '\012', '\166', '\105', '\161', '\040', '\166', '\113', '\040', '\061', - '\012', '\130', '\166', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\112', '\170', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\172', '\107', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\103', '\161', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\120', '\160', '\040', '\163', '\164', '\040', '\061', - '\012', '\166', '\101', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\127', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\162', '\143', '\132', '\040', '\143', '\155', '\040', '\061', - '\012', '\154', '\104', '\163', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\104', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\160', '\123', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\167', '\123', '\040', '\166', '\141', '\040', '\061', - '\012', '\153', '\147', '\121', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\162', '\124', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\113', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\150', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\115', '\154', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\113', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\144', '\106', '\040', '\144', '\145', '\040', '\061', - '\012', '\143', '\146', '\116', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\144', '\117', '\040', '\163', '\164', '\040', '\061', - '\012', '\153', '\110', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\166', '\105', '\040', '\166', '\141', '\040', '\061', - '\012', '\142', '\120', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\162', '\172', '\130', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\123', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\144', '\106', '\146', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\130', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\142', '\122', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\132', '\170', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\130', '\172', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\162', '\122', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\110', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\161', '\145', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\162', '\121', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\153', '\111', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\162', '\131', '\040', '\145', '\162', '\040', '\061', - '\012', '\152', '\161', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\132', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\124', '\155', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\110', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\144', '\161', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\154', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\166', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\113', '\154', '\170', '\040', '\154', '\145', '\040', '\061', - '\012', '\147', '\142', '\123', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\142', '\121', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\165', '\106', '\040', '\165', '\156', '\040', '\061', - '\012', '\161', '\172', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\141', '\111', '\040', '\141', '\156', '\040', '\061', - '\012', '\126', '\155', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\141', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\121', '\153', '\142', '\040', '\153', '\141', '\040', '\061', - '\012', '\130', '\152', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\157', '\103', '\161', '\040', '\107', '\103', '\040', '\061', - '\012', '\161', '\121', '\150', '\040', '\121', '\117', '\040', '\061', - '\012', '\143', '\167', '\117', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\115', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\162', '\113', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\113', '\171', '\040', '\167', '\141', '\040', '\061', - '\012', '\167', '\113', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\143', '\161', '\123', '\040', '\143', '\150', '\040', '\061', - '\012', '\151', '\107', '\166', '\040', '\151', '\156', '\040', '\061', - '\012', '\170', '\130', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\146', '\115', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\132', '\155', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\131', '\161', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\104', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\170', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\171', '\171', '\105', '\040', '\156', '\171', '\040', '\061', - '\012', '\163', '\125', '\166', '\040', '\163', '\164', '\040', '\061', - '\012', '\143', '\126', '\162', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\161', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\147', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\161', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\124', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\151', '\115', '\166', '\040', '\151', '\156', '\040', '\061', - '\012', '\161', '\127', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\144', '\126', '\040', '\144', '\145', '\040', '\061', - '\012', '\157', '\121', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\132', '\160', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\157', '\131', '\040', '\157', '\156', '\040', '\061', - '\012', '\152', '\122', '\153', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\120', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\161', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\161', '\130', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\102', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\160', '\130', '\040', '\160', '\162', '\040', '\061', - '\012', '\142', '\131', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\131', '\145', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\152', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\161', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\150', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\166', '\106', '\040', '\143', '\150', '\040', '\061', - '\012', '\131', '\143', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\106', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\110', '\144', '\171', '\040', '\144', '\145', '\040', '\061', - '\012', '\154', '\162', '\132', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\132', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\124', '\146', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\172', '\162', '\111', '\040', '\145', '\162', '\040', '\061', - '\012', '\144', '\104', '\166', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\145', '\110', '\040', '\145', '\162', '\040', '\061', - '\012', '\154', '\172', '\110', '\040', '\154', '\145', '\040', '\061', - '\012', '\163', '\114', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\151', '\113', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\106', '\172', '\143', '\040', '\143', '\155', '\040', '\061', - '\012', '\170', '\122', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\123', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\167', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\170', '\131', '\040', '\167', '\141', '\040', '\061', - '\012', '\131', '\153', '\167', '\040', '\153', '\141', '\040', '\061', - '\012', '\157', '\126', '\160', '\040', '\157', '\156', '\040', '\061', - '\012', '\143', '\147', '\102', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\106', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\152', '\124', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\132', '\172', '\040', '\144', '\145', '\040', '\061', - '\012', '\142', '\150', '\123', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\172', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\110', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\166', '\116', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\154', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\166', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\160', '\125', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\164', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\121', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\113', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\122', '\167', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\162', '\117', '\040', '\145', '\162', '\040', '\061', - '\012', '\156', '\160', '\102', '\040', '\141', '\156', '\040', '\061', - '\012', '\121', '\164', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\115', '\161', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\117', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\104', '\172', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\126', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\124', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\121', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\124', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\121', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\132', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\112', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\162', '\120', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\161', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\104', '\167', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\126', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\150', '\161', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\112', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\164', '\170', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\132', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\130', '\156', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\146', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\126', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\126', '\160', '\040', '\156', '\147', '\040', '\061', - '\012', '\156', '\102', '\160', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\156', '\132', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\161', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\120', '\172', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\112', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\156', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\113', '\170', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\144', '\130', '\154', '\040', '\130', '\155', '\040', '\061', - '\012', '\150', '\167', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\122', '\162', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\154', '\114', '\040', '\154', '\145', '\040', '\061', - '\012', '\146', '\117', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\121', '\167', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\103', '\155', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\106', '\142', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\150', '\127', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\123', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\102', '\170', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\172', '\143', '\102', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\166', '\130', '\040', '\154', '\145', '\040', '\061', - '\012', '\113', '\153', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\146', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\113', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\153', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\112', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\165', '\111', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\101', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\146', '\110', '\040', '\160', '\162', '\040', '\061', - '\012', '\121', '\167', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\167', '\142', '\125', '\040', '\167', '\141', '\040', '\061', - '\012', '\166', '\104', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\112', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\154', '\122', '\040', '\154', '\145', '\040', '\061', - '\012', '\155', '\130', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\162', '\110', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\157', '\126', '\172', '\040', '\157', '\156', '\040', '\061', - '\012', '\147', '\164', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\162', '\113', '\040', '\110', '\113', '\040', '\061', - '\012', '\127', '\170', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\160', '\156', '\112', '\040', '\141', '\156', '\040', '\061', - '\012', '\106', '\161', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\126', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\143', '\142', '\120', '\040', '\143', '\150', '\040', '\061', - '\012', '\107', '\152', '\143', '\040', '\152', '\123', '\040', '\061', - '\012', '\152', '\121', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\164', '\166', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\172', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\171', '\127', '\040', '\151', '\152', '\040', '\061', - '\012', '\130', '\142', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\161', '\146', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\166', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\142', '\114', '\040', '\167', '\141', '\040', '\061', - '\012', '\155', '\153', '\117', '\040', '\153', '\141', '\040', '\061', - '\012', '\145', '\161', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\166', '\123', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\107', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\127', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\154', '\130', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\112', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\114', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\116', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\153', '\172', '\121', '\040', '\163', '\172', '\040', '\061', - '\012', '\103', '\172', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\153', '\156', '\126', '\040', '\141', '\156', '\040', '\061', - '\012', '\122', '\152', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\116', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\120', '\155', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\170', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\150', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\125', '\166', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\146', '\125', '\040', '\146', '\157', '\040', '\061', - '\012', '\151', '\116', '\160', '\040', '\151', '\156', '\040', '\061', - '\012', '\171', '\131', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\157', '\120', '\142', '\040', '\157', '\156', '\040', '\061', - '\012', '\161', '\151', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\143', '\104', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\126', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\107', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\122', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\142', '\102', '\040', '\142', '\145', '\040', '\061', - '\012', '\163', '\132', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\147', '\170', '\117', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\106', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\115', '\170', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\170', '\120', '\040', '\144', '\145', '\040', '\061', - '\012', '\154', '\122', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\142', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\105', '\141', '\157', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\147', '\101', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\143', '\127', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\155', '\121', '\040', '\166', '\141', '\040', '\061', - '\012', '\131', '\161', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\151', '\117', '\040', '\151', '\156', '\040', '\061', - '\012', '\170', '\117', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\110', '\146', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\142', '\146', '\123', '\040', '\142', '\145', '\040', '\061', - '\012', '\121', '\150', '\156', '\040', '\164', '\150', '\040', '\061', - '\012', '\103', '\155', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\154', '\131', '\163', '\040', '\154', '\145', '\040', '\061', - '\012', '\116', '\161', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\145', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\164', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\115', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\165', '\150', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\123', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\144', '\131', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\146', '\127', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\123', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\123', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\103', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\160', '\167', '\103', '\040', '\160', '\162', '\040', '\061', - '\012', '\107', '\170', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\115', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\153', '\103', '\040', '\153', '\141', '\040', '\061', - '\012', '\165', '\161', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\102', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\163', '\127', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\132', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\170', '\152', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\110', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\167', '\116', '\040', '\167', '\141', '\040', '\061', - '\012', '\166', '\115', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\110', '\150', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\163', '\112', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\162', '\112', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\166', '\115', '\040', '\166', '\141', '\040', '\061', - '\012', '\155', '\130', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\127', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\144', '\170', '\132', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\126', '\152', '\040', '\163', '\164', '\040', '\061', - '\012', '\170', '\162', '\106', '\040', '\145', '\162', '\040', '\061', - '\012', '\160', '\142', '\125', '\040', '\160', '\162', '\040', '\061', - '\012', '\124', '\146', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\161', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\143', '\106', '\040', '\143', '\150', '\040', '\061', - '\012', '\156', '\162', '\123', '\040', '\141', '\156', '\040', '\061', - '\012', '\127', '\150', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\147', '\130', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\130', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\153', '\112', '\142', '\040', '\153', '\141', '\040', '\061', - '\012', '\162', '\132', '\153', '\040', '\145', '\162', '\040', '\061', - '\012', '\160', '\102', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\125', '\166', '\040', '\156', '\147', '\040', '\061', - '\012', '\110', '\161', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\113', '\161', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\106', '\152', '\040', '\157', '\156', '\040', '\061', - '\012', '\170', '\142', '\116', '\040', '\142', '\145', '\040', '\061', - '\012', '\160', '\156', '\113', '\040', '\141', '\156', '\040', '\061', - '\012', '\114', '\142', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\144', '\115', '\142', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\123', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\163', '\166', '\040', '\163', '\164', '\040', '\061', - '\012', '\167', '\162', '\126', '\040', '\145', '\162', '\040', '\061', - '\012', '\165', '\113', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\154', '\131', '\040', '\154', '\145', '\040', '\061', - '\012', '\147', '\170', '\106', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\152', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\162', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\162', '\166', '\106', '\040', '\145', '\162', '\040', '\061', - '\012', '\155', '\114', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\162', '\113', '\040', '\145', '\162', '\040', '\061', - '\012', '\121', '\154', '\172', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\170', '\104', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\144', '\131', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\166', '\104', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\121', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\106', '\165', '\040', '\165', '\156', '\040', '\061', - '\012', '\163', '\146', '\112', '\040', '\163', '\164', '\040', '\061', - '\012', '\160', '\111', '\146', '\040', '\160', '\162', '\040', '\061', - '\012', '\150', '\170', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\116', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\111', '\144', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\110', '\146', '\040', '\156', '\171', '\040', '\061', - '\012', '\161', '\130', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\154', '\104', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\106', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\127', '\160', '\040', '\151', '\152', '\040', '\061', - '\012', '\145', '\113', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\150', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\142', '\126', '\040', '\142', '\145', '\040', '\061', - '\012', '\170', '\130', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\131', '\150', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\167', '\130', '\040', '\167', '\141', '\040', '\061', - '\012', '\142', '\161', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\166', '\131', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\166', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\162', '\142', '\120', '\040', '\145', '\162', '\040', '\061', - '\012', '\163', '\130', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\125', '\167', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\155', '\127', '\040', '\155', '\145', '\040', '\061', - '\012', '\160', '\170', '\126', '\040', '\160', '\162', '\040', '\061', - '\012', '\156', '\152', '\132', '\040', '\141', '\156', '\040', '\061', - '\012', '\124', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\155', '\105', '\040', '\163', '\172', '\040', '\061', - '\012', '\122', '\161', '\165', '\040', '\165', '\156', '\040', '\061', - '\012', '\161', '\161', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\150', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\112', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\161', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\103', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\160', '\127', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\144', '\171', '\040', '\144', '\145', '\040', '\061', - '\012', '\151', '\122', '\170', '\040', '\151', '\156', '\040', '\061', - '\012', '\126', '\143', '\155', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\111', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\130', '\142', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\143', '\107', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\152', '\130', '\040', '\151', '\152', '\040', '\061', - '\012', '\156', '\155', '\117', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\121', '\152', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\146', '\126', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\142', '\113', '\040', '\144', '\145', '\040', '\061', - '\012', '\147', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\106', '\144', '\040', '\141', '\156', '\040', '\061', - '\012', '\157', '\127', '\166', '\040', '\157', '\156', '\040', '\061', - '\012', '\156', '\110', '\160', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\156', '\113', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\170', '\132', '\040', '\142', '\145', '\040', '\061', - '\012', '\167', '\155', '\110', '\040', '\155', '\145', '\040', '\061', - '\012', '\146', '\147', '\130', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\172', '\110', '\040', '\156', '\147', '\040', '\061', - '\012', '\132', '\142', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\147', '\115', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\155', '\113', '\040', '\144', '\145', '\040', '\061', - '\012', '\143', '\166', '\102', '\040', '\143', '\150', '\040', '\061', - '\012', '\145', '\121', '\163', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\110', '\155', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\102', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\110', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\166', '\161', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\116', '\160', '\171', '\040', '\160', '\162', '\040', '\061', - '\012', '\170', '\172', '\114', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\115', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\167', '\125', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\146', '\130', '\040', '\160', '\162', '\040', '\061', - '\012', '\156', '\106', '\147', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\106', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\126', '\161', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\105', '\155', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\130', '\171', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\126', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\166', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\110', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\127', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\170', '\143', '\113', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\125', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\114', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\165', '\126', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\106', '\163', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\107', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\167', '\171', '\040', '\167', '\141', '\040', '\061', - '\012', '\147', '\172', '\124', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\116', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\162', '\125', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\164', '\101', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\161', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\167', '\115', '\040', '\160', '\162', '\040', '\061', - '\012', '\154', '\162', '\120', '\040', '\145', '\162', '\040', '\061', - '\012', '\152', '\155', '\103', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\155', '\120', '\040', '\155', '\145', '\040', '\061', - '\012', '\171', '\151', '\131', '\040', '\151', '\156', '\040', '\061', - '\012', '\160', '\124', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\132', '\167', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\160', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\150', '\112', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\117', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\143', '\113', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\125', '\147', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\146', '\106', '\040', '\146', '\157', '\040', '\061', - '\012', '\143', '\124', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\160', '\130', '\040', '\156', '\147', '\040', '\061', - '\012', '\114', '\146', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\147', '\167', '\125', '\040', '\156', '\147', '\040', '\061', - '\012', '\104', '\172', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\153', '\104', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\120', '\166', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\144', '\131', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\127', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\163', '\121', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\152', '\131', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\103', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\162', '\123', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\123', '\146', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\132', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\115', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\116', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\152', '\124', '\166', '\040', '\151', '\152', '\040', '\061', - '\012', '\164', '\155', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\170', '\112', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\101', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\110', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\146', '\147', '\101', '\040', '\156', '\147', '\040', '\061', - '\012', '\122', '\150', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\127', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\146', '\125', '\040', '\160', '\162', '\040', '\061', - '\012', '\157', '\111', '\152', '\040', '\157', '\156', '\040', '\061', - '\012', '\154', '\150', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\104', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\166', '\112', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\104', '\160', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\151', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\146', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\170', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\106', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\150', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\152', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\164', '\155', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\155', '\115', '\040', '\155', '\145', '\040', '\061', - '\012', '\143', '\126', '\171', '\040', '\143', '\150', '\040', '\061', - '\012', '\113', '\172', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\146', '\101', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\152', '\122', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\171', '\121', '\040', '\156', '\171', '\040', '\061', - '\012', '\155', '\102', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\121', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\144', '\132', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\145', '\126', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\116', '\166', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\106', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\150', '\154', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\143', '\156', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\167', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\132', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\150', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\127', '\146', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\112', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\131', '\172', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\105', '\157', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\116', '\152', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\132', '\147', '\144', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\107', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\147', '\131', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\171', '\105', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\172', '\105', '\040', '\163', '\172', '\040', '\061', - '\012', '\165', '\152', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\142', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\163', '\146', '\040', '\163', '\164', '\040', '\061', - '\012', '\155', '\121', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\121', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\171', '\130', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\131', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\145', '\120', '\166', '\040', '\145', '\162', '\040', '\061', - '\012', '\141', '\103', '\166', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\126', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\172', '\170', '\117', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\152', '\127', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\147', '\111', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\132', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\164', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\115', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\124', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\115', '\170', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\142', '\111', '\040', '\142', '\145', '\040', '\061', - '\012', '\161', '\101', '\165', '\040', '\165', '\156', '\040', '\061', - '\012', '\167', '\146', '\124', '\040', '\167', '\141', '\040', '\061', - '\012', '\146', '\143', '\106', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\146', '\113', '\040', '\160', '\162', '\040', '\061', - '\012', '\142', '\117', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\165', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\112', '\155', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\160', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\161', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\117', '\166', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\130', '\154', '\152', '\040', '\154', '\145', '\040', '\061', - '\012', '\116', '\162', '\154', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\170', '\127', '\040', '\146', '\157', '\040', '\061', - '\012', '\123', '\167', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\166', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\160', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\116', '\167', '\040', '\157', '\156', '\040', '\061', - '\012', '\153', '\131', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\130', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\121', '\146', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\145', '\104', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\126', '\161', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\113', '\172', '\040', '\165', '\163', '\040', '\061', - '\012', '\161', '\152', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\125', '\170', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\114', '\153', '\171', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\106', '\171', '\040', '\163', '\172', '\040', '\061', - '\012', '\156', '\115', '\154', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\131', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\143', '\121', '\145', '\040', '\143', '\150', '\040', '\061', - '\012', '\157', '\131', '\152', '\040', '\157', '\156', '\040', '\061', - '\012', '\164', '\142', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\131', '\142', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\156', '\126', '\153', '\040', '\156', '\144', '\040', '\061', - '\012', '\142', '\130', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\114', '\161', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\144', '\113', '\040', '\144', '\145', '\040', '\061', - '\012', '\160', '\144', '\120', '\040', '\144', '\145', '\040', '\061', - '\012', '\164', '\161', '\123', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\152', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\143', '\103', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\132', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\141', '\123', '\144', '\040', '\141', '\156', '\040', '\061', - '\012', '\103', '\155', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\172', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\121', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\107', '\161', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\127', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\130', '\162', '\167', '\040', '\145', '\162', '\040', '\061', - '\012', '\171', '\112', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\163', '\161', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\127', '\142', '\040', '\144', '\145', '\040', '\061', - '\012', '\156', '\142', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\151', '\167', '\120', '\040', '\151', '\156', '\040', '\061', - '\012', '\154', '\127', '\163', '\040', '\154', '\145', '\040', '\061', - '\012', '\124', '\163', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\110', '\172', '\040', '\144', '\145', '\040', '\061', - '\012', '\164', '\143', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\153', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\102', '\144', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\115', '\170', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\152', '\126', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\121', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\144', '\156', '\111', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\171', '\131', '\040', '\156', '\171', '\040', '\061', - '\012', '\141', '\106', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\131', '\154', '\170', '\040', '\154', '\145', '\040', '\061', - '\012', '\131', '\171', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\152', '\142', '\126', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\143', '\126', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\172', '\130', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\122', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\152', '\101', '\040', '\144', '\145', '\040', '\061', - '\012', '\142', '\156', '\111', '\040', '\141', '\156', '\040', '\061', - '\012', '\114', '\154', '\166', '\040', '\154', '\145', '\040', '\061', - '\012', '\164', '\155', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\121', '\157', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\164', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\122', '\170', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\170', '\127', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\164', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\161', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\110', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\122', '\152', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\116', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\107', '\151', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\131', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\131', '\144', '\160', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\127', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\153', '\102', '\040', '\153', '\141', '\040', '\061', - '\012', '\153', '\170', '\103', '\040', '\153', '\141', '\040', '\061', - '\012', '\154', '\152', '\101', '\040', '\154', '\145', '\040', '\061', - '\012', '\121', '\167', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\155', '\103', '\160', '\040', '\155', '\145', '\040', '\061', - '\012', '\146', '\112', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\103', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\143', '\172', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\102', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\143', '\131', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\110', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\153', '\166', '\127', '\040', '\153', '\141', '\040', '\061', - '\012', '\112', '\155', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\121', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\142', '\121', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\170', '\130', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\106', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\124', '\152', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\170', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\144', '\131', '\040', '\144', '\145', '\040', '\061', - '\012', '\160', '\155', '\106', '\040', '\155', '\145', '\040', '\061', - '\012', '\163', '\104', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\162', '\126', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\104', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\102', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\110', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\172', '\121', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\126', '\160', '\040', '\154', '\145', '\040', '\061', - '\012', '\147', '\146', '\110', '\040', '\156', '\147', '\040', '\061', - '\012', '\157', '\107', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\166', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\115', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\156', '\123', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\121', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\165', '\157', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\153', '\130', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\110', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\165', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\142', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\167', '\107', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\160', '\130', '\040', '\143', '\150', '\040', '\061', - '\012', '\122', '\160', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\113', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\125', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\156', '\112', '\040', '\141', '\156', '\040', '\061', - '\012', '\122', '\160', '\171', '\040', '\160', '\162', '\040', '\061', - '\012', '\142', '\143', '\123', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\170', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\152', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\121', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\162', '\130', '\040', '\145', '\162', '\040', '\061', - '\012', '\106', '\143', '\147', '\040', '\143', '\150', '\040', '\061', - '\012', '\157', '\126', '\170', '\040', '\157', '\156', '\040', '\061', - '\012', '\166', '\112', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\102', '\166', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\144', '\155', '\130', '\040', '\144', '\145', '\040', '\061', - '\012', '\127', '\144', '\152', '\040', '\144', '\145', '\040', '\061', - '\012', '\131', '\172', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\131', '\143', '\144', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\113', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\162', '\110', '\040', '\145', '\162', '\040', '\061', - '\012', '\114', '\156', '\155', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\103', '\155', '\040', '\163', '\172', '\040', '\061', - '\012', '\125', '\167', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\125', '\166', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\115', '\146', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\161', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\146', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\110', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\153', '\147', '\112', '\040', '\156', '\147', '\040', '\061', - '\012', '\141', '\107', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\152', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\153', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\110', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\116', '\172', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\132', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\166', '\113', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\154', '\106', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\155', '\104', '\040', '\155', '\145', '\040', '\061', - '\012', '\131', '\160', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\106', '\171', '\040', '\160', '\162', '\040', '\061', - '\012', '\150', '\166', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\164', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\161', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\166', '\116', '\040', '\153', '\141', '\040', '\061', - '\012', '\164', '\143', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\153', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\144', '\110', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\105', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\143', '\167', '\040', '\143', '\150', '\040', '\061', - '\012', '\126', '\167', '\165', '\040', '\165', '\156', '\040', '\061', - '\012', '\147', '\130', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\127', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\127', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\112', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\123', '\152', '\040', '\157', '\156', '\040', '\061', - '\012', '\154', '\167', '\131', '\040', '\154', '\145', '\040', '\061', - '\012', '\124', '\153', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\160', '\143', '\103', '\040', '\143', '\150', '\040', '\061', - '\012', '\157', '\150', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\172', '\107', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\144', '\116', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\162', '\123', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\110', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\152', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\142', '\132', '\040', '\166', '\141', '\040', '\061', - '\012', '\125', '\144', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\172', '\130', '\040', '\163', '\172', '\040', '\061', - '\012', '\165', '\116', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\146', '\132', '\040', '\167', '\141', '\040', '\061', - '\012', '\163', '\167', '\102', '\040', '\163', '\164', '\040', '\061', - '\012', '\144', '\155', '\121', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\143', '\101', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\172', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\112', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\127', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\126', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\167', '\102', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\111', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\142', '\160', '\125', '\040', '\160', '\162', '\040', '\061', - '\012', '\142', '\167', '\115', '\040', '\167', '\141', '\040', '\061', - '\012', '\146', '\153', '\101', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\125', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\124', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\113', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\154', '\170', '\123', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\141', '\123', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\166', '\121', '\040', '\166', '\141', '\040', '\061', - '\012', '\144', '\150', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\144', '\127', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\146', '\112', '\040', '\167', '\141', '\040', '\061', - '\012', '\127', '\161', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\132', '\152', '\040', '\163', '\164', '\040', '\061', - '\012', '\114', '\170', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\170', '\130', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\161', '\104', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\113', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\166', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\146', '\110', '\040', '\153', '\141', '\040', '\061', - '\012', '\141', '\121', '\160', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\106', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\156', '\152', '\127', '\040', '\141', '\156', '\040', '\061', - '\012', '\122', '\160', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\115', '\155', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\150', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\113', '\153', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\101', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\146', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\167', '\116', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\160', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\170', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\107', '\144', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\115', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\167', '\114', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\102', '\142', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\101', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\123', '\144', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\112', '\155', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\142', '\147', '\130', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\127', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\150', '\110', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\107', '\167', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\106', '\142', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\172', '\157', '\124', '\040', '\157', '\156', '\040', '\061', - '\012', '\171', '\152', '\107', '\040', '\151', '\152', '\040', '\061', - '\012', '\122', '\154', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\106', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\143', '\113', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\144', '\103', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\166', '\117', '\040', '\166', '\141', '\040', '\061', - '\012', '\157', '\121', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\156', '\111', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\172', '\101', '\040', '\163', '\172', '\040', '\061', - '\012', '\122', '\172', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\121', '\172', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\131', '\152', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\153', '\121', '\040', '\153', '\165', '\040', '\061', - '\012', '\154', '\162', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\167', '\132', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\107', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\155', '\156', '\114', '\040', '\141', '\156', '\040', '\061', - '\012', '\122', '\154', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\143', '\104', '\040', '\143', '\150', '\040', '\061', - '\012', '\162', '\122', '\144', '\040', '\145', '\162', '\040', '\061', - '\012', '\117', '\146', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\106', '\152', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\165', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\132', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\116', '\142', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\156', '\127', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\142', '\110', '\040', '\151', '\152', '\040', '\061', - '\012', '\162', '\104', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\121', '\155', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\167', '\126', '\040', '\144', '\145', '\040', '\061', - '\012', '\117', '\161', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\161', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\167', '\111', '\040', '\167', '\141', '\040', '\061', - '\012', '\156', '\152', '\120', '\040', '\141', '\156', '\040', '\061', - '\012', '\117', '\161', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\126', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\146', '\117', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\161', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\104', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\124', '\155', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\143', '\113', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\155', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\126', '\170', '\040', '\163', '\164', '\040', '\061', - '\012', '\127', '\146', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\112', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\165', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\146', '\116', '\040', '\142', '\145', '\040', '\061', - '\012', '\161', '\146', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\106', '\155', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\164', '\142', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\152', '\116', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\150', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\116', '\170', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\167', '\170', '\125', '\040', '\167', '\141', '\040', '\061', - '\012', '\172', '\130', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\116', '\172', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\157', '\150', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\126', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\163', '\170', '\040', '\163', '\164', '\040', '\061', - '\012', '\132', '\161', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\125', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\152', '\103', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\124', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\161', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\106', '\171', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\111', '\143', '\144', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\166', '\116', '\040', '\163', '\164', '\040', '\061', - '\012', '\112', '\152', '\166', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\126', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\146', '\144', '\111', '\040', '\144', '\145', '\040', '\061', - '\012', '\156', '\142', '\130', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\146', '\125', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\107', '\155', '\040', '\154', '\145', '\040', '\061', - '\012', '\117', '\166', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\104', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\147', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\131', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\152', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\120', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\151', '\122', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\162', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\160', '\124', '\040', '\160', '\162', '\040', '\061', - '\012', '\170', '\163', '\102', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\170', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\106', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\157', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\155', '\104', '\040', '\163', '\164', '\040', '\061', - '\012', '\154', '\142', '\115', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\103', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\106', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\130', '\154', '\166', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\171', '\125', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\106', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\164', '\152', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\131', '\170', '\040', '\151', '\156', '\040', '\061', - '\012', '\165', '\112', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\145', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\162', '\166', '\040', '\145', '\162', '\040', '\061', - '\012', '\102', '\161', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\144', '\142', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\156', '\122', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\155', '\114', '\040', '\155', '\145', '\040', '\061', - '\012', '\164', '\166', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\124', '\155', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\104', '\147', '\142', '\040', '\156', '\147', '\040', '\061', - '\012', '\157', '\172', '\117', '\040', '\157', '\156', '\040', '\061', - '\012', '\146', '\121', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\120', '\161', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\131', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\120', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\147', '\127', '\146', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\103', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\145', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\132', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\147', '\132', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\152', '\117', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\103', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\166', '\121', '\040', '\163', '\164', '\040', '\061', - '\012', '\122', '\161', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\142', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\114', '\153', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\106', '\172', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\154', '\102', '\040', '\154', '\145', '\040', '\061', - '\012', '\151', '\127', '\152', '\040', '\151', '\156', '\040', '\061', - '\012', '\132', '\170', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\113', '\170', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\152', '\143', '\112', '\040', '\151', '\152', '\040', '\061', - '\012', '\165', '\103', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\101', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\126', '\152', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\125', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\115', '\156', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\152', '\115', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\125', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\165', '\132', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\167', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\131', '\164', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\122', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\172', '\126', '\040', '\163', '\172', '\040', '\061', - '\012', '\155', '\166', '\131', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\106', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\102', '\160', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\107', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\125', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\147', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\127', '\142', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\167', '\120', '\040', '\167', '\141', '\040', '\061', - '\012', '\167', '\166', '\105', '\040', '\166', '\141', '\040', '\061', - '\012', '\106', '\163', '\170', '\040', '\163', '\164', '\040', '\061', - '\012', '\111', '\172', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\167', '\103', '\040', '\167', '\141', '\040', '\061', - '\012', '\106', '\155', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\114', '\144', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\122', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\151', '\130', '\146', '\040', '\151', '\156', '\040', '\061', - '\012', '\171', '\115', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\161', '\120', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\163', '\114', '\040', '\163', '\164', '\040', '\061', - '\012', '\152', '\111', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\165', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\142', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\105', '\161', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\117', '\147', '\146', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\107', '\166', '\040', '\153', '\141', '\040', '\061', - '\012', '\160', '\152', '\113', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\143', '\121', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\172', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\125', '\166', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\107', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\150', '\155', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\161', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\153', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\147', '\130', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\167', '\117', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\155', '\123', '\040', '\155', '\145', '\040', '\061', - '\012', '\166', '\150', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\171', '\130', '\040', '\163', '\164', '\040', '\061', - '\012', '\156', '\142', '\103', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\147', '\127', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\161', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\127', '\146', '\040', '\144', '\145', '\040', '\061', - '\012', '\143', '\167', '\106', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\156', '\106', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\104', '\151', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\123', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\121', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\162', '\132', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\107', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\170', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\162', '\127', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\154', '\130', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\106', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\160', '\142', '\106', '\040', '\160', '\162', '\040', '\061', - '\012', '\142', '\116', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\121', '\143', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\126', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\160', '\120', '\146', '\040', '\160', '\162', '\040', '\061', - '\012', '\160', '\126', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\154', '\107', '\040', '\154', '\145', '\040', '\061', - '\012', '\104', '\167', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\121', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\154', '\153', '\121', '\040', '\154', '\145', '\040', '\061', - '\012', '\163', '\161', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\171', '\170', '\040', '\156', '\171', '\040', '\061', - '\012', '\166', '\106', '\155', '\040', '\166', '\141', '\040', '\061', - '\012', '\164', '\121', '\157', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\154', '\125', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\154', '\127', '\040', '\154', '\145', '\040', '\061', - '\012', '\147', '\154', '\127', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\155', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\141', '\127', '\154', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\155', '\126', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\114', '\155', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\154', '\102', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\161', '\101', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\147', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\107', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\167', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\106', '\146', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\167', '\155', '\114', '\040', '\155', '\145', '\040', '\061', - '\012', '\170', '\114', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\142', '\105', '\040', '\163', '\164', '\040', '\061', - '\012', '\142', '\121', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\153', '\122', '\040', '\153', '\141', '\040', '\061', - '\012', '\171', '\106', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\117', '\155', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\146', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\112', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\114', '\167', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\167', '\146', '\125', '\040', '\167', '\141', '\040', '\061', - '\012', '\172', '\146', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\116', '\166', '\040', '\154', '\145', '\040', '\061', - '\012', '\171', '\153', '\121', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\104', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\104', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\142', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\121', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\166', '\166', '\115', '\040', '\166', '\141', '\040', '\061', - '\012', '\130', '\161', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\114', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\153', '\132', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\101', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\152', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\106', '\167', '\040', '\143', '\150', '\040', '\061', - '\012', '\162', '\167', '\121', '\040', '\145', '\162', '\040', '\061', - '\012', '\155', '\127', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\131', '\162', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\145', '\125', '\157', '\040', '\145', '\162', '\040', '\061', - '\012', '\165', '\104', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\115', '\150', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\107', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\122', '\160', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\163', '\142', '\106', '\040', '\163', '\164', '\040', '\061', - '\012', '\156', '\146', '\130', '\040', '\141', '\156', '\040', '\061', - '\012', '\127', '\146', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\115', '\167', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\104', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\160', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\172', '\106', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\130', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\163', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\132', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\114', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\161', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\152', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\153', '\104', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\112', '\170', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\126', '\161', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\110', '\166', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\161', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\122', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\166', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\116', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\127', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\122', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\162', '\107', '\142', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\132', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\130', '\164', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\132', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\126', '\155', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\144', '\115', '\160', '\040', '\144', '\145', '\040', '\061', - '\012', '\143', '\120', '\171', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\172', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\152', '\105', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\172', '\106', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\103', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\146', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\143', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\132', '\146', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\167', '\103', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\153', '\115', '\040', '\153', '\157', '\040', '\061', - '\012', '\166', '\112', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\145', '\103', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\120', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\161', '\112', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\155', '\131', '\040', '\144', '\145', '\040', '\061', - '\012', '\165', '\115', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\113', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\161', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\116', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\103', '\162', '\152', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\163', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\167', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\123', '\144', '\171', '\040', '\144', '\145', '\040', '\061', - '\012', '\106', '\160', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\127', '\143', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\152', '\127', '\040', '\151', '\152', '\040', '\061', - '\012', '\144', '\167', '\127', '\040', '\144', '\145', '\040', '\061', - '\012', '\147', '\152', '\130', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\132', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\143', '\113', '\147', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\144', '\122', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\161', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\150', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\147', '\107', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\115', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\156', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\112', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\166', '\103', '\040', '\166', '\141', '\040', '\061', - '\012', '\143', '\160', '\122', '\040', '\143', '\150', '\040', '\061', - '\012', '\127', '\164', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\171', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\130', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\113', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\126', '\166', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\172', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\120', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\124', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\106', '\152', '\040', '\163', '\164', '\040', '\061', - '\012', '\155', '\172', '\130', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\115', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\170', '\111', '\040', '\145', '\162', '\040', '\061', - '\012', '\145', '\131', '\146', '\040', '\145', '\162', '\040', '\061', - '\012', '\153', '\167', '\102', '\040', '\153', '\141', '\040', '\061', - '\012', '\145', '\121', '\153', '\040', '\145', '\162', '\040', '\061', - '\012', '\152', '\102', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\142', '\110', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\103', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\156', '\166', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\131', '\144', '\040', '\156', '\147', '\040', '\061', - '\012', '\132', '\170', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\132', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\110', '\147', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\122', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\160', '\122', '\040', '\160', '\162', '\040', '\061', - '\012', '\143', '\142', '\122', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\161', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\115', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\121', '\171', '\040', '\164', '\157', '\040', '\061', - '\012', '\166', '\170', '\107', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\160', '\102', '\040', '\156', '\147', '\040', '\061', - '\012', '\107', '\153', '\167', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\161', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\120', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\156', '\116', '\040', '\141', '\156', '\040', '\061', - '\012', '\107', '\153', '\160', '\040', '\153', '\141', '\040', '\061', - '\012', '\155', '\166', '\121', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\110', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\146', '\123', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\103', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\161', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\147', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\115', '\167', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\161', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\106', '\153', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\157', '\106', '\166', '\040', '\157', '\156', '\040', '\061', - '\012', '\104', '\144', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\111', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\146', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\147', '\121', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\170', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\161', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\110', '\164', '\156', '\040', '\164', '\150', '\040', '\061', - '\012', '\107', '\166', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\122', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\103', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\162', '\152', '\124', '\040', '\162', '\157', '\040', '\061', - '\012', '\162', '\152', '\104', '\040', '\145', '\162', '\040', '\061', - '\012', '\121', '\160', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\130', '\144', '\142', '\040', '\144', '\145', '\040', '\061', - '\012', '\114', '\153', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\101', '\152', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\131', '\154', '\172', '\040', '\154', '\145', '\040', '\061', - '\012', '\121', '\164', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\110', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\104', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\114', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\150', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\114', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\147', '\113', '\040', '\156', '\147', '\040', '\061', - '\012', '\145', '\127', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\152', '\123', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\126', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\117', '\153', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\105', '\167', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\104', '\163', '\166', '\040', '\163', '\164', '\040', '\061', - '\012', '\152', '\150', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\107', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\117', '\153', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\106', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\120', '\166', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\163', '\113', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\114', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\153', '\102', '\040', '\153', '\141', '\040', '\061', - '\012', '\143', '\103', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\116', '\160', '\040', '\156', '\147', '\040', '\061', - '\012', '\121', '\167', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\124', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\120', '\161', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\106', '\166', '\040', '\162', '\157', '\040', '\061', - '\012', '\122', '\167', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\113', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\161', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\155', '\113', '\040', '\153', '\141', '\040', '\061', - '\012', '\167', '\165', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\156', '\132', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\147', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\144', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\101', '\170', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\167', '\117', '\040', '\167', '\141', '\040', '\061', - '\012', '\145', '\121', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\106', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\104', '\160', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\160', '\121', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\141', '\106', '\160', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\146', '\102', '\040', '\155', '\145', '\040', '\061', - '\012', '\146', '\160', '\101', '\040', '\160', '\162', '\040', '\061', - '\012', '\152', '\147', '\132', '\040', '\156', '\147', '\040', '\061', - '\012', '\154', '\107', '\153', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\143', '\101', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\127', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\154', '\172', '\106', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\163', '\121', '\040', '\163', '\164', '\040', '\061', - '\012', '\142', '\121', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\167', '\152', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\104', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\127', '\160', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\162', '\146', '\126', '\040', '\145', '\162', '\040', '\061', - '\012', '\132', '\142', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\150', '\113', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\130', '\141', '\040', '\141', '\162', '\040', '\061', - '\012', '\167', '\152', '\101', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\172', '\123', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\127', '\171', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\152', '\113', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\122', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\161', '\147', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\161', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\156', '\125', '\040', '\141', '\156', '\040', '\061', - '\012', '\132', '\161', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\161', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\114', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\172', '\126', '\040', '\156', '\147', '\040', '\061', - '\012', '\113', '\161', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\147', '\132', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\161', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\161', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\111', '\145', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\152', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\155', '\116', '\040', '\166', '\141', '\040', '\061', - '\012', '\151', '\165', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\107', '\171', '\040', '\167', '\141', '\040', '\061', - '\012', '\113', '\144', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\121', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\127', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\103', '\170', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\113', '\161', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\130', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\157', '\121', '\040', '\157', '\156', '\040', '\061', - '\012', '\167', '\102', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\171', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\150', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\160', '\171', '\040', '\160', '\162', '\040', '\061', - '\012', '\156', '\112', '\142', '\040', '\141', '\156', '\040', '\061', - '\012', '\165', '\107', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\150', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\152', '\123', '\040', '\151', '\152', '\040', '\061', - '\012', '\123', '\143', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\106', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\113', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\130', '\155', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\144', '\124', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\112', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\124', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\152', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\115', '\161', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\110', '\160', '\040', '\144', '\145', '\040', '\061', - '\012', '\162', '\122', '\156', '\040', '\141', '\162', '\040', '\061', - '\012', '\130', '\154', '\146', '\040', '\154', '\145', '\040', '\061', - '\012', '\143', '\116', '\163', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\161', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\151', '\106', '\172', '\040', '\151', '\156', '\040', '\061', - '\012', '\116', '\154', '\153', '\040', '\154', '\145', '\040', '\061', - '\012', '\163', '\120', '\167', '\040', '\163', '\164', '\040', '\061', - '\012', '\166', '\127', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\130', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\156', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\157', '\172', '\112', '\040', '\157', '\156', '\040', '\061', - '\012', '\172', '\111', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\154', '\123', '\146', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\122', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\102', '\166', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\127', '\167', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\160', '\127', '\147', '\040', '\160', '\162', '\040', '\061', - '\012', '\160', '\114', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\153', '\162', '\112', '\040', '\145', '\162', '\040', '\061', - '\012', '\132', '\146', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\171', '\111', '\170', '\040', '\156', '\171', '\040', '\061', - '\012', '\157', '\113', '\170', '\040', '\157', '\156', '\040', '\061', - '\012', '\161', '\114', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\110', '\152', '\040', '\144', '\145', '\040', '\061', - '\012', '\157', '\161', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\170', '\103', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\112', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\132', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\143', '\127', '\172', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\161', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\130', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\131', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\107', '\171', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\104', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\113', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\130', '\152', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\152', '\115', '\040', '\163', '\164', '\040', '\061', - '\012', '\163', '\146', '\103', '\040', '\163', '\164', '\040', '\061', - '\012', '\144', '\115', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\132', '\160', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\143', '\104', '\040', '\143', '\150', '\040', '\061', - '\012', '\121', '\157', '\152', '\040', '\157', '\156', '\040', '\061', - '\012', '\147', '\170', '\103', '\040', '\156', '\147', '\040', '\061', - '\012', '\132', '\146', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\131', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\127', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\132', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\121', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\130', '\154', '\142', '\040', '\154', '\145', '\040', '\061', - '\012', '\147', '\121', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\156', '\142', '\132', '\040', '\141', '\156', '\040', '\061', - '\012', '\105', '\172', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\116', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\130', '\162', '\152', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\170', '\130', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\121', '\160', '\040', '\144', '\145', '\040', '\061', - '\012', '\131', '\160', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\116', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\160', '\142', '\121', '\040', '\160', '\162', '\040', '\061', - '\012', '\147', '\115', '\166', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\145', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\126', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\126', '\153', '\040', '\144', '\145', '\040', '\061', - '\012', '\165', '\115', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\121', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\150', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\124', '\142', '\040', '\151', '\156', '\040', '\061', - '\012', '\120', '\166', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\103', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\143', '\122', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\166', '\125', '\040', '\163', '\164', '\040', '\061', - '\012', '\156', '\115', '\172', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\152', '\105', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\155', '\110', '\040', '\151', '\152', '\040', '\061', - '\012', '\121', '\172', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\161', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\154', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\166', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\110', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\147', '\161', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\163', '\116', '\040', '\163', '\164', '\040', '\061', - '\012', '\153', '\103', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\117', '\154', '\170', '\040', '\154', '\145', '\040', '\061', - '\012', '\107', '\170', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\170', '\167', '\126', '\040', '\167', '\141', '\040', '\061', - '\012', '\146', '\120', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\122', '\150', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\147', '\126', '\040', '\156', '\147', '\040', '\061', - '\012', '\121', '\144', '\160', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\106', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\153', '\154', '\121', '\040', '\154', '\145', '\040', '\061', - '\012', '\171', '\112', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\162', '\170', '\105', '\040', '\145', '\162', '\040', '\061', - '\012', '\165', '\110', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\113', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\160', '\112', '\040', '\160', '\162', '\040', '\061', - '\012', '\103', '\152', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\164', '\131', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\160', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\132', '\170', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\121', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\106', '\170', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\121', '\157', '\153', '\040', '\157', '\156', '\040', '\061', - '\012', '\160', '\154', '\113', '\040', '\154', '\145', '\040', '\061', - '\012', '\154', '\160', '\130', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\144', '\120', '\040', '\144', '\145', '\040', '\061', - '\012', '\132', '\161', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\122', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\156', '\104', '\147', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\161', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\147', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\115', '\142', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\113', '\161', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\116', '\161', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\172', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\163', '\107', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\104', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\112', '\152', '\153', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\164', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\167', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\104', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\147', '\146', '\107', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\150', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\125', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\127', '\142', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\153', '\106', '\040', '\153', '\157', '\040', '\061', - '\012', '\120', '\161', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\142', '\113', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\123', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\167', '\111', '\040', '\166', '\141', '\040', '\061', - '\012', '\143', '\106', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\146', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\150', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\172', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\144', '\116', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\167', '\122', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\172', '\113', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\121', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\114', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\125', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\162', '\110', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\165', '\112', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\106', '\150', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\116', '\172', '\155', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\122', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\130', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\124', '\172', '\155', '\040', '\163', '\172', '\040', '\061', - '\012', '\132', '\153', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\150', '\114', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\125', '\153', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\115', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\166', '\107', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\164', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\170', '\105', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\162', '\110', '\040', '\145', '\162', '\040', '\061', - '\012', '\106', '\147', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\154', '\106', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\143', '\117', '\040', '\152', '\141', '\040', '\061', - '\012', '\163', '\103', '\167', '\040', '\163', '\164', '\040', '\061', - '\012', '\102', '\161', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\132', '\171', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\117', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\112', '\142', '\040', '\145', '\162', '\040', '\061', - '\012', '\162', '\152', '\126', '\040', '\145', '\162', '\040', '\061', - '\012', '\113', '\167', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\110', '\143', '\167', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\103', '\167', '\040', '\155', '\141', '\040', '\061', - '\012', '\150', '\170', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\124', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\155', '\121', '\040', '\155', '\145', '\040', '\061', - '\012', '\160', '\152', '\122', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\144', '\120', '\040', '\143', '\150', '\040', '\061', - '\012', '\132', '\152', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\152', '\161', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\115', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\115', '\161', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\166', '\130', '\040', '\163', '\164', '\040', '\061', - '\012', '\151', '\130', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\156', '\167', '\122', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\164', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\152', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\103', '\152', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\160', '\130', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\107', '\167', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\111', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\121', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\131', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\166', '\164', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\125', '\163', '\170', '\040', '\163', '\164', '\040', '\061', - '\012', '\156', '\146', '\120', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\121', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\157', '\130', '\146', '\040', '\157', '\156', '\040', '\061', - '\012', '\146', '\105', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\163', '\147', '\130', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\120', '\160', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\142', '\127', '\040', '\142', '\145', '\040', '\061', - '\012', '\153', '\143', '\127', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\110', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\166', '\143', '\125', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\130', '\157', '\040', '\164', '\150', '\040', '\061', - '\012', '\113', '\172', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\103', '\146', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\125', '\152', '\171', '\040', '\151', '\152', '\040', '\061', - '\012', '\106', '\170', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\170', '\123', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\127', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\154', '\113', '\040', '\154', '\145', '\040', '\061', - '\012', '\156', '\132', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\117', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\153', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\172', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\165', '\124', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\162', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\120', '\164', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\104', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\162', '\116', '\155', '\040', '\145', '\162', '\040', '\061', - '\012', '\105', '\167', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\150', '\112', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\144', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\164', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\161', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\156', '\110', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\162', '\150', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\157', '\161', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\160', '\132', '\040', '\166', '\141', '\040', '\061', - '\012', '\104', '\147', '\144', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\170', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\103', '\170', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\154', '\126', '\040', '\160', '\162', '\040', '\061', - '\012', '\153', '\111', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\113', '\150', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\163', '\131', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\114', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\131', '\153', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\155', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\172', '\166', '\111', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\150', '\123', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\146', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\170', '\132', '\040', '\167', '\141', '\040', '\061', - '\012', '\152', '\126', '\171', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\121', '\167', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\130', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\114', '\150', '\163', '\040', '\164', '\150', '\040', '\061', - '\012', '\115', '\153', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\153', '\125', '\040', '\151', '\152', '\040', '\061', - '\012', '\131', '\150', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\162', '\110', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\150', '\107', '\040', '\166', '\141', '\040', '\061', - '\012', '\144', '\162', '\104', '\040', '\145', '\162', '\040', '\061', - '\012', '\120', '\163', '\152', '\040', '\163', '\164', '\040', '\061', - '\012', '\147', '\104', '\146', '\040', '\156', '\147', '\040', '\061', - '\012', '\130', '\152', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\114', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\153', '\154', '\103', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\124', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\162', '\112', '\040', '\145', '\162', '\040', '\061', - '\012', '\130', '\147', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\127', '\170', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\146', '\144', '\104', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\110', '\160', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\104', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\153', '\120', '\166', '\040', '\153', '\141', '\040', '\061', - '\012', '\122', '\153', '\155', '\040', '\153', '\141', '\040', '\061', - '\012', '\155', '\172', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\154', '\110', '\172', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\160', '\122', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\132', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\102', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\120', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\116', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\116', '\166', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\171', '\125', '\040', '\160', '\162', '\040', '\061', - '\012', '\123', '\152', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\113', '\172', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\157', '\121', '\160', '\040', '\157', '\156', '\040', '\061', - '\012', '\170', '\144', '\114', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\156', '\132', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\146', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\112', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\127', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\130', '\155', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\162', '\107', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\163', '\106', '\146', '\040', '\163', '\164', '\040', '\061', - '\012', '\126', '\167', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\164', '\113', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\121', '\170', '\040', '\163', '\164', '\040', '\061', - '\012', '\157', '\116', '\155', '\040', '\157', '\156', '\040', '\061', - '\012', '\165', '\130', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\163', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\127', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\146', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\111', '\152', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\153', '\127', '\040', '\144', '\145', '\040', '\061', - '\012', '\116', '\170', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\165', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\120', '\171', '\040', '\142', '\145', '\040', '\061', - '\012', '\154', '\113', '\163', '\040', '\154', '\145', '\040', '\061', - '\012', '\141', '\114', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\120', '\160', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\160', '\132', '\040', '\160', '\162', '\040', '\061', - '\012', '\146', '\152', '\105', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\116', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\150', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\121', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\170', '\102', '\040', '\142', '\145', '\040', '\061', - '\012', '\146', '\144', '\130', '\040', '\144', '\145', '\040', '\061', - '\012', '\112', '\143', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\106', '\144', '\160', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\126', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\164', '\155', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\152', '\112', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\172', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\164', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\143', '\130', '\040', '\143', '\150', '\040', '\061', - '\012', '\107', '\150', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\132', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\113', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\166', '\117', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\130', '\163', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\122', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\147', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\160', '\117', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\127', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\125', '\160', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\167', '\104', '\040', '\166', '\141', '\040', '\061', - '\012', '\155', '\170', '\105', '\040', '\155', '\145', '\040', '\061', - '\012', '\132', '\166', '\155', '\040', '\166', '\141', '\040', '\061', - '\012', '\157', '\172', '\115', '\040', '\157', '\156', '\040', '\061', - '\012', '\146', '\142', '\112', '\040', '\142', '\145', '\040', '\061', - '\012', '\164', '\160', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\145', '\126', '\040', '\145', '\162', '\040', '\061', - '\012', '\132', '\156', '\142', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\130', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\142', '\143', '\131', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\147', '\132', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\146', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\143', '\114', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\130', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\165', '\102', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\170', '\127', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\164', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\147', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\101', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\102', '\166', '\040', '\151', '\152', '\040', '\061', - '\012', '\107', '\164', '\171', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\146', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\170', '\161', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\102', '\160', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\161', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\166', '\115', '\040', '\166', '\141', '\040', '\061', - '\012', '\165', '\127', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\123', '\142', '\040', '\145', '\162', '\040', '\061', - '\012', '\130', '\161', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\124', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\114', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\112', '\162', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\157', '\112', '\142', '\040', '\157', '\156', '\040', '\061', - '\012', '\160', '\130', '\171', '\040', '\160', '\162', '\040', '\061', - '\012', '\172', '\162', '\121', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\156', '\124', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\163', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\132', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\126', '\171', '\040', '\142', '\145', '\040', '\061', - '\012', '\161', '\111', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\147', '\122', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\114', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\126', '\154', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\122', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\150', '\101', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\114', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\123', '\147', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\114', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\124', '\170', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\160', '\131', '\040', '\160', '\162', '\040', '\061', - '\012', '\164', '\130', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\143', '\103', '\040', '\143', '\150', '\040', '\061', - '\012', '\151', '\131', '\146', '\040', '\151', '\156', '\040', '\061', - '\012', '\127', '\167', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\153', '\132', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\131', '\167', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\106', '\166', '\040', '\156', '\147', '\040', '\061', - '\012', '\106', '\155', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\165', '\121', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\167', '\122', '\040', '\167', '\141', '\040', '\061', - '\012', '\131', '\146', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\141', '\111', '\157', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\102', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\172', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\167', '\111', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\106', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\141', '\127', '\166', '\040', '\141', '\156', '\040', '\061', - '\012', '\105', '\141', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\153', '\127', '\040', '\153', '\141', '\040', '\061', - '\012', '\116', '\146', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\154', '\116', '\040', '\154', '\145', '\040', '\061', - '\012', '\114', '\160', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\171', '\154', '\113', '\040', '\154', '\145', '\040', '\061', - '\012', '\132', '\156', '\162', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\143', '\121', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\146', '\105', '\040', '\153', '\141', '\040', '\061', - '\012', '\111', '\171', '\146', '\040', '\156', '\171', '\040', '\061', - '\012', '\161', '\162', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\120', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\146', '\147', '\112', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\111', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\142', '\120', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\121', '\171', '\170', '\040', '\156', '\171', '\040', '\061', - '\012', '\121', '\156', '\142', '\040', '\141', '\156', '\040', '\061', - '\012', '\127', '\144', '\155', '\040', '\144', '\145', '\040', '\061', - '\012', '\156', '\112', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\103', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\132', '\154', '\040', '\156', '\147', '\040', '\061', - '\012', '\116', '\154', '\172', '\040', '\154', '\145', '\040', '\061', - '\012', '\132', '\167', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\127', '\154', '\040', '\151', '\156', '\040', '\061', - '\012', '\142', '\125', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\142', '\112', '\040', '\154', '\145', '\040', '\061', - '\012', '\163', '\116', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\152', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\142', '\124', '\040', '\167', '\141', '\040', '\061', - '\012', '\171', '\116', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\170', '\115', '\040', '\155', '\145', '\040', '\061', - '\012', '\160', '\110', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\122', '\144', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\153', '\105', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\142', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\124', '\147', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\152', '\126', '\040', '\156', '\147', '\040', '\061', - '\012', '\107', '\152', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\161', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\130', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\121', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\116', '\142', '\040', '\160', '\162', '\040', '\061', - '\012', '\146', '\112', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\171', '\166', '\132', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\116', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\104', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\125', '\172', '\040', '\154', '\145', '\040', '\061', - '\012', '\104', '\170', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\127', '\167', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\120', '\156', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\116', '\142', '\040', '\153', '\157', '\040', '\061', - '\012', '\127', '\144', '\142', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\130', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\152', '\114', '\040', '\151', '\152', '\040', '\061', - '\012', '\164', '\112', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\155', '\115', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\130', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\124', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\131', '\163', '\146', '\040', '\163', '\164', '\040', '\061', - '\012', '\150', '\155', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\171', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\106', '\160', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\121', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\120', '\142', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\126', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\150', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\123', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\107', '\170', '\172', '\040', '\172', '\145', '\040', '\061', - '\012', '\104', '\146', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\162', '\115', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\172', '\115', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\112', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\112', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\146', '\116', '\040', '\146', '\157', '\040', '\061', - '\012', '\144', '\121', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\165', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\152', '\102', '\040', '\151', '\152', '\040', '\061', - '\012', '\154', '\120', '\152', '\040', '\154', '\145', '\040', '\061', - '\012', '\155', '\161', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\146', '\115', '\040', '\155', '\145', '\040', '\061', - '\012', '\153', '\167', '\107', '\040', '\153', '\141', '\040', '\061', - '\012', '\145', '\141', '\131', '\040', '\141', '\156', '\040', '\061', - '\012', '\126', '\155', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\172', '\146', '\123', '\040', '\163', '\172', '\040', '\061', - '\012', '\106', '\155', '\171', '\040', '\155', '\145', '\040', '\061', - '\012', '\163', '\161', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\113', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\121', '\144', '\166', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\152', '\132', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\162', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\170', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\170', '\110', '\040', '\142', '\145', '\040', '\061', - '\012', '\152', '\122', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\152', '\104', '\040', '\143', '\150', '\040', '\061', - '\012', '\123', '\170', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\123', '\170', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\162', '\132', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\155', '\110', '\040', '\155', '\145', '\040', '\061', - '\012', '\144', '\146', '\110', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\112', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\155', '\167', '\132', '\040', '\155', '\145', '\040', '\061', - '\012', '\166', '\122', '\155', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\167', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\130', '\161', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\107', '\166', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\150', '\172', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\156', '\113', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\150', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\116', '\154', '\163', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\142', '\126', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\124', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\170', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\165', '\160', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\101', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\113', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\154', '\104', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\124', '\154', '\040', '\164', '\150', '\040', '\061', - '\012', '\107', '\161', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\170', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\172', '\120', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\166', '\132', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\110', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\151', '\130', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\113', '\147', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\112', '\171', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\166', '\106', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\164', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\102', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\147', '\117', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\152', '\116', '\040', '\151', '\152', '\040', '\061', - '\012', '\104', '\152', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\111', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\165', '\104', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\112', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\101', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\106', '\163', '\152', '\040', '\163', '\164', '\040', '\061', - '\012', '\171', '\104', '\146', '\040', '\156', '\171', '\040', '\061', - '\012', '\170', '\152', '\126', '\040', '\151', '\152', '\040', '\061', - '\012', '\150', '\144', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\167', '\107', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\154', '\127', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\131', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\172', '\117', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\161', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\172', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\155', '\107', '\040', '\155', '\145', '\040', '\061', - '\012', '\113', '\144', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\126', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\164', '\105', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\112', '\171', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\152', '\127', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\167', '\122', '\040', '\155', '\145', '\040', '\061', - '\012', '\172', '\126', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\115', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\161', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\154', '\121', '\040', '\154', '\145', '\040', '\061', - '\012', '\142', '\170', '\121', '\040', '\142', '\145', '\040', '\061', - '\012', '\150', '\112', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\156', '\131', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\146', '\123', '\040', '\156', '\171', '\040', '\061', - '\012', '\115', '\144', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\132', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\163', '\112', '\040', '\163', '\164', '\040', '\061', - '\012', '\121', '\161', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\170', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\101', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\112', '\167', '\040', '\154', '\145', '\040', '\061', - '\012', '\153', '\167', '\112', '\040', '\153', '\141', '\040', '\061', - '\012', '\163', '\170', '\103', '\040', '\163', '\164', '\040', '\061', - '\012', '\150', '\112', '\162', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\107', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\143', '\143', '\106', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\107', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\123', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\161', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\153', '\126', '\040', '\153', '\141', '\040', '\061', - '\012', '\147', '\126', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\161', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\112', '\160', '\040', '\153', '\141', '\040', '\061', - '\012', '\127', '\154', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\112', '\167', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\105', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\162', '\114', '\040', '\145', '\162', '\040', '\061', - '\012', '\164', '\161', '\105', '\040', '\164', '\150', '\040', '\061', - '\012', '\145', '\112', '\172', '\040', '\145', '\162', '\040', '\061', - '\012', '\127', '\150', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\127', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\121', '\172', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\143', '\106', '\040', '\143', '\150', '\040', '\061', - '\012', '\126', '\155', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\144', '\166', '\103', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\152', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\153', '\106', '\040', '\153', '\141', '\040', '\061', - '\012', '\143', '\166', '\117', '\040', '\143', '\150', '\040', '\061', - '\012', '\121', '\171', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\116', '\163', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\156', '\112', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\152', '\125', '\040', '\151', '\152', '\040', '\061', - '\012', '\131', '\146', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\114', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\162', '\126', '\172', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\117', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\170', '\114', '\040', '\146', '\157', '\040', '\061', - '\012', '\163', '\156', '\127', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\127', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\167', '\147', '\113', '\040', '\156', '\147', '\040', '\061', - '\012', '\141', '\124', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\145', '\126', '\146', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\132', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\165', '\126', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\152', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\167', '\124', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\123', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\156', '\116', '\160', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\146', '\106', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\143', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\124', '\146', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\141', '\112', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\172', '\131', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\152', '\130', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\115', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\142', '\164', '\102', '\040', '\163', '\164', '\040', '\061', - '\012', '\172', '\146', '\105', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\170', '\117', '\040', '\142', '\145', '\040', '\061', - '\012', '\167', '\120', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\147', '\113', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\172', '\127', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\143', '\130', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\161', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\115', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\132', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\164', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\153', '\131', '\040', '\153', '\141', '\040', '\061', - '\012', '\154', '\103', '\142', '\040', '\154', '\145', '\040', '\061', - '\012', '\144', '\160', '\117', '\040', '\144', '\145', '\040', '\061', - '\012', '\155', '\130', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\166', '\127', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\117', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\147', '\171', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\153', '\104', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\121', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\111', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\132', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\172', '\113', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\126', '\160', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\104', '\155', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\116', '\167', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\153', '\131', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\160', '\112', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\130', '\151', '\040', '\161', '\165', '\040', '\061', - '\012', '\102', '\156', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\146', '\113', '\040', '\146', '\157', '\040', '\061', - '\012', '\146', '\103', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\120', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\121', '\156', '\160', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\160', '\127', '\040', '\160', '\162', '\040', '\061', - '\012', '\165', '\167', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\120', '\166', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\143', '\156', '\103', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\166', '\101', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\107', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\132', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\142', '\123', '\040', '\153', '\141', '\040', '\061', - '\012', '\123', '\167', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\150', '\166', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\161', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\114', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\152', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\125', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\154', '\104', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\154', '\160', '\040', '\154', '\145', '\040', '\061', - '\012', '\144', '\167', '\121', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\154', '\116', '\040', '\154', '\145', '\040', '\061', - '\012', '\146', '\124', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\116', '\160', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\142', '\115', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\116', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\145', '\146', '\126', '\040', '\145', '\162', '\040', '\061', - '\012', '\141', '\103', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\141', '\127', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\114', '\161', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\172', '\124', '\040', '\163', '\172', '\040', '\061', - '\012', '\112', '\152', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\172', '\166', '\113', '\040', '\163', '\172', '\040', '\061', - '\012', '\156', '\167', '\124', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\130', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\107', '\155', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\166', '\123', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\104', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\122', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\131', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\121', '\166', '\040', '\151', '\156', '\040', '\061', - '\012', '\146', '\153', '\110', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\143', '\117', '\040', '\143', '\150', '\040', '\061', - '\012', '\162', '\116', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\155', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\172', '\122', '\040', '\163', '\172', '\040', '\061', - '\012', '\104', '\146', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\125', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\161', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\130', '\153', '\040', '\163', '\164', '\040', '\061', - '\012', '\130', '\171', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\127', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\142', '\114', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\131', '\144', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\161', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\106', '\161', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\157', '\130', '\040', '\157', '\156', '\040', '\061', - '\012', '\172', '\165', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\125', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\147', '\103', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\102', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\121', '\160', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\156', '\105', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\132', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\153', '\104', '\040', '\153', '\141', '\040', '\061', - '\012', '\163', '\126', '\153', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\171', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\102', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\103', '\152', '\171', '\040', '\151', '\152', '\040', '\061', - '\012', '\144', '\120', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\104', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\170', '\102', '\040', '\144', '\145', '\040', '\061', - '\012', '\104', '\153', '\155', '\040', '\153', '\141', '\040', '\061', - '\012', '\153', '\120', '\160', '\040', '\153', '\141', '\040', '\061', - '\012', '\150', '\127', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\102', '\152', '\166', '\040', '\151', '\152', '\040', '\061', - '\012', '\111', '\172', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\110', '\156', '\153', '\040', '\141', '\156', '\040', '\061', - '\012', '\162', '\121', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\112', '\167', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\142', '\120', '\040', '\142', '\145', '\040', '\061', - '\012', '\146', '\162', '\121', '\040', '\145', '\162', '\040', '\061', - '\012', '\101', '\157', '\166', '\040', '\157', '\156', '\040', '\061', - '\012', '\171', '\161', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\146', '\131', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\163', '\110', '\040', '\163', '\164', '\040', '\061', - '\012', '\172', '\170', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\142', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\115', '\152', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\122', '\160', '\040', '\156', '\147', '\040', '\061', - '\012', '\107', '\166', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\155', '\172', '\106', '\040', '\163', '\172', '\040', '\061', - '\012', '\157', '\161', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\145', '\152', '\125', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\155', '\121', '\040', '\155', '\145', '\040', '\061', - '\012', '\150', '\117', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\167', '\130', '\040', '\160', '\162', '\040', '\061', - '\012', '\172', '\147', '\113', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\114', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\161', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\120', '\155', '\040', '\144', '\145', '\040', '\061', - '\012', '\164', '\103', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\162', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\127', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\162', '\104', '\146', '\040', '\145', '\162', '\040', '\061', - '\012', '\131', '\156', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\156', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\106', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\160', '\125', '\040', '\145', '\162', '\040', '\061', - '\012', '\160', '\120', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\152', '\115', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\155', '\131', '\040', '\151', '\152', '\040', '\061', - '\012', '\103', '\160', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\165', '\104', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\165', '\161', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\120', '\152', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\106', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\113', '\164', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\143', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\160', '\117', '\040', '\160', '\162', '\040', '\061', - '\012', '\160', '\147', '\132', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\146', '\117', '\040', '\153', '\141', '\040', '\061', - '\012', '\164', '\132', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\110', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\122', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\104', '\155', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\120', '\155', '\040', '\154', '\145', '\040', '\061', - '\012', '\163', '\166', '\120', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\153', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\116', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\113', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\161', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\121', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\164', '\170', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\160', '\146', '\040', '\160', '\162', '\040', '\061', - '\012', '\151', '\121', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\166', '\120', '\040', '\166', '\141', '\040', '\061', - '\012', '\151', '\107', '\146', '\040', '\151', '\156', '\040', '\061', - '\012', '\164', '\152', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\127', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\121', '\161', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\151', '\106', '\040', '\164', '\151', '\040', '\061', - '\012', '\132', '\172', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\141', '\131', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\152', '\101', '\040', '\163', '\172', '\040', '\061', - '\012', '\153', '\167', '\122', '\040', '\153', '\141', '\040', '\061', - '\012', '\147', '\153', '\115', '\040', '\156', '\147', '\040', '\061', - '\012', '\103', '\152', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\147', '\115', '\040', '\156', '\147', '\040', '\061', - '\012', '\122', '\170', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\142', '\103', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\131', '\160', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\171', '\105', '\040', '\167', '\141', '\040', '\061', - '\012', '\151', '\171', '\102', '\040', '\151', '\156', '\040', '\061', - '\012', '\150', '\121', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\160', '\121', '\040', '\151', '\156', '\040', '\061', - '\012', '\125', '\143', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\153', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\162', '\113', '\040', '\145', '\162', '\040', '\061', - '\012', '\110', '\160', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\170', '\156', '\116', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\167', '\102', '\040', '\151', '\152', '\040', '\061', - '\012', '\132', '\144', '\155', '\040', '\144', '\145', '\040', '\061', - '\012', '\155', '\131', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\164', '\121', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\167', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\110', '\170', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\161', '\104', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\130', '\144', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\144', '\117', '\040', '\156', '\147', '\040', '\061', - '\012', '\141', '\105', '\157', '\040', '\141', '\156', '\040', '\061', - '\012', '\124', '\167', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\141', '\166', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\154', '\150', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\172', '\126', '\040', '\154', '\145', '\040', '\061', - '\012', '\142', '\110', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\142', '\112', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\125', '\161', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\106', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\116', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\102', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\144', '\122', '\142', '\040', '\144', '\145', '\040', '\061', - '\012', '\156', '\154', '\124', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\162', '\117', '\040', '\145', '\162', '\040', '\061', - '\012', '\154', '\172', '\127', '\040', '\154', '\145', '\040', '\061', - '\012', '\146', '\131', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\155', '\122', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\162', '\130', '\171', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\171', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\107', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\125', '\167', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\153', '\130', '\155', '\040', '\153', '\141', '\040', '\061', - '\012', '\150', '\112', '\171', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\147', '\166', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\131', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\171', '\131', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\172', '\103', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\152', '\102', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\172', '\111', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\162', '\117', '\040', '\145', '\162', '\040', '\061', - '\012', '\164', '\161', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\167', '\115', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\103', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\152', '\114', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\156', '\132', '\040', '\141', '\156', '\040', '\061', - '\012', '\145', '\104', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\166', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\146', '\114', '\040', '\160', '\162', '\040', '\061', - '\012', '\151', '\122', '\142', '\040', '\151', '\156', '\040', '\061', - '\012', '\147', '\144', '\122', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\101', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\156', '\114', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\153', '\124', '\040', '\153', '\141', '\040', '\061', - '\012', '\160', '\126', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\113', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\116', '\153', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\114', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\116', '\160', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\155', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\126', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\146', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\125', '\161', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\104', '\156', '\160', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\107', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\163', '\110', '\144', '\040', '\163', '\164', '\040', '\061', - '\012', '\160', '\167', '\106', '\040', '\160', '\162', '\040', '\061', - '\012', '\146', '\120', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\104', '\162', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\112', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\121', '\160', '\040', '\163', '\164', '\040', '\061', - '\012', '\111', '\167', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\165', '\103', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\167', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\162', '\106', '\167', '\040', '\145', '\162', '\040', '\061', - '\012', '\163', '\112', '\160', '\040', '\163', '\164', '\040', '\061', - '\012', '\170', '\151', '\111', '\040', '\151', '\156', '\040', '\061', - '\012', '\122', '\161', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\153', '\121', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\116', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\131', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\126', '\155', '\146', '\040', '\155', '\145', '\040', '\061', - '\012', '\154', '\131', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\157', '\120', '\167', '\040', '\157', '\156', '\040', '\061', - '\012', '\153', '\152', '\117', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\113', '\142', '\040', '\155', '\145', '\040', '\061', - '\012', '\146', '\104', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\146', '\106', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\126', '\150', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\146', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\113', '\152', '\160', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\124', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\102', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\110', '\164', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\116', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\142', '\121', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\141', '\123', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\167', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\125', '\171', '\170', '\040', '\156', '\171', '\040', '\061', - '\012', '\167', '\126', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\111', '\157', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\116', '\150', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\161', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\125', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\102', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\107', '\161', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\103', '\143', '\167', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\132', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\142', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\106', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\163', '\132', '\166', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\172', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\104', '\142', '\040', '\160', '\162', '\040', '\061', - '\012', '\143', '\146', '\122', '\040', '\143', '\150', '\040', '\061', - '\012', '\162', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\172', '\120', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\161', '\117', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\172', '\110', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\123', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\170', '\112', '\040', '\160', '\162', '\040', '\061', - '\012', '\170', '\142', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\130', '\146', '\040', '\163', '\164', '\040', '\061', - '\012', '\171', '\142', '\124', '\040', '\142', '\145', '\040', '\061', - '\012', '\163', '\110', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\124', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\120', '\147', '\146', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\113', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\120', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\124', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\152', '\123', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\106', '\147', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\113', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\145', '\125', '\152', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\104', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\106', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\156', '\127', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\125', '\171', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\147', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\165', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\171', '\121', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\103', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\122', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\130', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\107', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\130', '\156', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\120', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\146', '\132', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\126', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\167', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\104', '\172', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\146', '\107', '\040', '\146', '\157', '\040', '\061', - '\012', '\146', '\130', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\147', '\126', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\112', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\130', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\147', '\107', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\165', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\170', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\170', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\116', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\157', '\102', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\147', '\166', '\040', '\156', '\147', '\040', '\061', - '\012', '\110', '\167', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\157', '\141', '\127', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\122', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\165', '\130', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\172', '\121', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\143', '\102', '\040', '\143', '\150', '\040', '\061', - '\012', '\102', '\156', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\166', '\102', '\040', '\156', '\147', '\040', '\061', - '\012', '\162', '\121', '\155', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\166', '\125', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\150', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\170', '\122', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\164', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\113', '\153', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\112', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\165', '\167', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\123', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\171', '\122', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\156', '\103', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\107', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\147', '\124', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\116', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\157', '\110', '\153', '\040', '\157', '\156', '\040', '\061', - '\012', '\127', '\172', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\166', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\153', '\130', '\040', '\163', '\164', '\040', '\061', - '\012', '\166', '\131', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\157', '\132', '\040', '\157', '\156', '\040', '\061', - '\012', '\156', '\107', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\155', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\102', '\155', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\163', '\126', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\165', '\103', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\151', '\130', '\172', '\040', '\151', '\156', '\040', '\061', - '\012', '\166', '\113', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\154', '\105', '\167', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\150', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\167', '\123', '\040', '\151', '\156', '\040', '\061', - '\012', '\161', '\171', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\152', '\131', '\040', '\151', '\152', '\040', '\061', - '\012', '\131', '\147', '\155', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\112', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\145', '\121', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\131', '\146', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\127', '\160', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\144', '\123', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\155', '\107', '\040', '\166', '\141', '\040', '\061', - '\012', '\155', '\144', '\124', '\040', '\144', '\145', '\040', '\061', - '\012', '\147', '\162', '\132', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\161', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\102', '\160', '\040', '\160', '\157', '\040', '\061', - '\012', '\146', '\153', '\132', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\145', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\107', '\163', '\040', '\143', '\150', '\040', '\061', - '\012', '\105', '\161', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\146', '\117', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\123', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\104', '\150', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\152', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\161', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\121', '\146', '\040', '\156', '\171', '\040', '\061', - '\012', '\156', '\160', '\131', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\104', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\155', '\121', '\040', '\155', '\145', '\040', '\061', - '\012', '\153', '\115', '\142', '\040', '\153', '\141', '\040', '\061', - '\012', '\141', '\161', '\103', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\131', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\153', '\104', '\040', '\153', '\141', '\040', '\061', - '\012', '\143', '\127', '\163', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\171', '\112', '\040', '\156', '\171', '\040', '\061', - '\012', '\167', '\166', '\126', '\040', '\166', '\141', '\040', '\061', - '\012', '\154', '\131', '\142', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\162', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\161', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\152', '\103', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\113', '\171', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\152', '\104', '\040', '\151', '\152', '\040', '\061', - '\012', '\163', '\104', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\113', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\172', '\163', '\124', '\040', '\163', '\164', '\040', '\061', - '\012', '\152', '\131', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\131', '\167', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\152', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\111', '\171', '\040', '\167', '\141', '\040', '\061', - '\012', '\146', '\146', '\125', '\040', '\146', '\157', '\040', '\061', - '\012', '\127', '\156', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\145', '\110', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\127', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\116', '\167', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\171', '\123', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\146', '\103', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\130', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\162', '\111', '\040', '\156', '\147', '\040', '\061', - '\012', '\157', '\126', '\146', '\040', '\157', '\156', '\040', '\061', - '\012', '\126', '\146', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\152', '\147', '\131', '\040', '\156', '\147', '\040', '\061', - '\012', '\110', '\152', '\160', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\161', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\171', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\143', '\121', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\163', '\105', '\040', '\163', '\164', '\040', '\061', - '\012', '\160', '\103', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\153', '\167', '\120', '\040', '\153', '\141', '\040', '\061', - '\012', '\152', '\146', '\121', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\132', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\126', '\170', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\112', '\166', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\163', '\105', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\114', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\144', '\117', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\160', '\123', '\040', '\160', '\162', '\040', '\061', - '\012', '\171', '\111', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\164', '\107', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\110', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\107', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\166', '\121', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\116', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\161', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\146', '\113', '\040', '\163', '\164', '\040', '\061', - '\012', '\144', '\131', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\115', '\155', '\040', '\163', '\164', '\040', '\061', - '\012', '\157', '\102', '\170', '\040', '\157', '\156', '\040', '\061', - '\012', '\161', '\163', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\155', '\111', '\040', '\155', '\145', '\040', '\061', - '\012', '\164', '\155', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\154', '\127', '\040', '\154', '\145', '\040', '\061', - '\012', '\124', '\167', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\162', '\126', '\040', '\145', '\162', '\040', '\061', - '\012', '\162', '\116', '\172', '\040', '\145', '\162', '\040', '\061', - '\012', '\125', '\165', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\107', '\152', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\156', '\152', '\131', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\117', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\155', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\156', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\166', '\131', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\107', '\146', '\040', '\160', '\162', '\040', '\061', - '\012', '\154', '\110', '\160', '\040', '\141', '\154', '\040', '\061', - '\012', '\161', '\147', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\142', '\123', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\121', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\164', '\161', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\167', '\111', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\153', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\170', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\150', '\104', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\121', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\151', '\112', '\160', '\040', '\151', '\156', '\040', '\061', - '\012', '\170', '\162', '\116', '\040', '\145', '\162', '\040', '\061', - '\012', '\144', '\107', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\121', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\112', '\161', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\115', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\152', '\124', '\040', '\154', '\145', '\040', '\061', - '\012', '\130', '\153', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\164', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\116', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\165', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\125', '\157', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\152', '\122', '\040', '\144', '\145', '\040', '\061', - '\012', '\155', '\106', '\146', '\040', '\155', '\145', '\040', '\061', - '\012', '\152', '\172', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\152', '\122', '\040', '\163', '\172', '\040', '\061', - '\012', '\116', '\156', '\154', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\112', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\132', '\162', '\040', '\156', '\147', '\040', '\061', - '\012', '\102', '\167', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\144', '\127', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\167', '\115', '\040', '\154', '\145', '\040', '\061', - '\012', '\111', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\167', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\115', '\167', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\152', '\131', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\102', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\151', '\167', '\106', '\040', '\151', '\156', '\040', '\061', - '\012', '\162', '\110', '\172', '\040', '\145', '\162', '\040', '\061', - '\012', '\123', '\161', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\157', '\113', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\152', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\164', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\113', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\161', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\131', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\102', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\155', '\112', '\040', '\156', '\147', '\040', '\061', - '\012', '\145', '\131', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\107', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\121', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\156', '\130', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\166', '\112', '\040', '\166', '\141', '\040', '\061', - '\012', '\163', '\170', '\115', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\116', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\154', '\152', '\040', '\154', '\145', '\040', '\061', - '\012', '\153', '\161', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\144', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\150', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\154', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\161', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\142', '\104', '\040', '\142', '\145', '\040', '\061', - '\012', '\170', '\101', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\160', '\114', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\110', '\142', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\126', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\150', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\170', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\126', '\146', '\040', '\144', '\145', '\040', '\061', - '\012', '\132', '\153', '\155', '\040', '\153', '\141', '\040', '\061', - '\012', '\153', '\160', '\104', '\040', '\153', '\141', '\040', '\061', - '\012', '\160', '\152', '\110', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\107', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\151', '\171', '\120', '\040', '\151', '\156', '\040', '\061', - '\012', '\167', '\155', '\113', '\040', '\155', '\145', '\040', '\061', - '\012', '\155', '\112', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\155', '\114', '\040', '\155', '\145', '\040', '\061', - '\012', '\143', '\102', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\126', '\166', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\105', '\161', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\150', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\103', '\170', '\040', '\154', '\145', '\040', '\061', - '\012', '\157', '\127', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\156', '\172', '\130', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\111', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\120', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\131', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\172', '\150', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\161', '\116', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\155', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\130', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\154', '\132', '\152', '\040', '\154', '\145', '\040', '\061', - '\012', '\123', '\170', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\113', '\161', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\127', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\113', '\143', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\166', '\102', '\040', '\160', '\157', '\040', '\061', - '\012', '\164', '\147', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\162', '\116', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\121', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\130', '\166', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\112', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\146', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\106', '\166', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\125', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\154', '\132', '\142', '\040', '\154', '\145', '\040', '\061', - '\012', '\147', '\144', '\111', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\157', '\111', '\040', '\157', '\156', '\040', '\061', - '\012', '\171', '\113', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\167', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\112', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\170', '\115', '\040', '\166', '\141', '\040', '\061', - '\012', '\126', '\172', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\152', '\122', '\040', '\151', '\152', '\040', '\061', - '\012', '\113', '\155', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\111', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\171', '\104', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\142', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\153', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\126', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\106', '\150', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\112', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\120', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\125', '\145', '\157', '\040', '\145', '\162', '\040', '\061', - '\012', '\172', '\130', '\144', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\106', '\142', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\112', '\171', '\040', '\151', '\152', '\040', '\061', - '\012', '\116', '\163', '\152', '\040', '\163', '\164', '\040', '\061', - '\012', '\154', '\115', '\142', '\040', '\154', '\145', '\040', '\061', - '\012', '\171', '\121', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\156', '\115', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\122', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\106', '\152', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\113', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\161', '\126', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\103', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\117', '\172', '\040', '\163', '\164', '\040', '\061', - '\012', '\150', '\154', '\117', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\142', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\152', '\116', '\040', '\163', '\164', '\040', '\061', - '\012', '\125', '\152', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\162', '\126', '\155', '\040', '\145', '\162', '\040', '\061', - '\012', '\127', '\152', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\142', '\155', '\115', '\040', '\155', '\145', '\040', '\061', - '\012', '\126', '\172', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\132', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\106', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\150', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\116', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\142', '\124', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\155', '\112', '\040', '\155', '\145', '\040', '\061', - '\012', '\106', '\143', '\163', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\124', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\123', '\147', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\155', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\106', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\144', '\111', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\154', '\113', '\040', '\154', '\145', '\040', '\061', - '\012', '\142', '\156', '\102', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\171', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\152', '\153', '\040', '\151', '\152', '\040', '\061', - '\012', '\150', '\172', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\147', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\161', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\116', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\124', '\152', '\160', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\154', '\126', '\040', '\154', '\145', '\040', '\061', - '\012', '\162', '\126', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\142', '\114', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\144', '\121', '\040', '\144', '\145', '\040', '\061', - '\012', '\147', '\131', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\150', '\105', '\040', '\164', '\150', '\040', '\061', - '\012', '\107', '\163', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\127', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\121', '\164', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\172', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\153', '\111', '\157', '\040', '\150', '\157', '\040', '\061', - '\012', '\153', '\146', '\103', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\102', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\112', '\160', '\040', '\151', '\152', '\040', '\061', - '\012', '\145', '\111', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\165', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\142', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\112', '\152', '\160', '\040', '\151', '\152', '\040', '\061', - '\012', '\154', '\130', '\153', '\040', '\154', '\145', '\040', '\061', - '\012', '\124', '\146', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\172', '\114', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\144', '\161', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\132', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\146', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\150', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\153', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\105', '\152', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\167', '\116', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\121', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\104', '\160', '\040', '\144', '\145', '\040', '\061', - '\012', '\120', '\167', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\172', '\164', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\164', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\162', '\130', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\167', '\124', '\040', '\166', '\141', '\040', '\061', - '\012', '\171', '\122', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\121', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\130', '\172', '\040', '\154', '\145', '\040', '\061', - '\012', '\143', '\146', '\114', '\040', '\143', '\150', '\040', '\061', - '\012', '\106', '\167', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\162', '\116', '\167', '\040', '\145', '\162', '\040', '\061', - '\012', '\102', '\150', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\154', '\132', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\143', '\104', '\040', '\143', '\150', '\040', '\061', - '\012', '\123', '\146', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\125', '\172', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\124', '\144', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\144', '\122', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\131', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\143', '\104', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\143', '\103', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\102', '\170', '\040', '\154', '\145', '\040', '\061', - '\012', '\147', '\110', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\112', '\171', '\040', '\167', '\141', '\040', '\061', - '\012', '\171', '\162', '\117', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\161', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\131', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\152', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\114', '\153', '\040', '\151', '\152', '\040', '\061', - '\012', '\110', '\166', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\156', '\123', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\143', '\124', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\106', '\153', '\040', '\163', '\164', '\040', '\061', - '\012', '\144', '\143', '\117', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\120', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\116', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\107', '\144', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\154', '\120', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\114', '\170', '\040', '\152', '\157', '\040', '\061', - '\012', '\152', '\132', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\167', '\124', '\040', '\167', '\141', '\040', '\061', - '\012', '\164', '\107', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\150', '\123', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\164', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\156', '\127', '\040', '\157', '\156', '\040', '\061', - '\012', '\160', '\153', '\112', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\111', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\132', '\170', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\156', '\117', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\110', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\152', '\123', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\144', '\114', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\142', '\116', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\153', '\117', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\161', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\172', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\142', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\106', '\161', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\127', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\156', '\170', '\115', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\160', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\124', '\164', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\163', '\110', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\152', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\111', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\153', '\131', '\040', '\153', '\141', '\040', '\061', - '\012', '\106', '\161', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\157', '\107', '\153', '\040', '\157', '\156', '\040', '\061', - '\012', '\110', '\156', '\143', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\120', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\154', '\127', '\040', '\154', '\145', '\040', '\061', - '\012', '\165', '\122', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\107', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\131', '\166', '\040', '\151', '\152', '\040', '\061', - '\012', '\113', '\160', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\121', '\157', '\040', '\156', '\147', '\040', '\061', - '\012', '\113', '\167', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\152', '\116', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\164', '\144', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\107', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\114', '\142', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\162', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\166', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\150', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\132', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\104', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\120', '\152', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\147', '\106', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\103', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\127', '\167', '\040', '\157', '\167', '\040', '\061', - '\012', '\155', '\112', '\160', '\040', '\155', '\145', '\040', '\061', - '\012', '\146', '\130', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\165', '\131', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\110', '\153', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\144', '\120', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\106', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\162', '\107', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\147', '\104', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\163', '\107', '\040', '\163', '\164', '\040', '\061', - '\012', '\126', '\147', '\142', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\101', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\164', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\154', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\124', '\155', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\147', '\171', '\131', '\040', '\156', '\147', '\040', '\061', - '\012', '\121', '\170', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\125', '\170', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\151', '\126', '\162', '\040', '\151', '\156', '\040', '\061', - '\012', '\172', '\161', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\116', '\142', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\104', '\150', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\117', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\151', '\102', '\144', '\040', '\151', '\156', '\040', '\061', - '\012', '\143', '\161', '\102', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\121', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\142', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\121', '\153', '\163', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\120', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\146', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\132', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\160', '\104', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\156', '\112', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\143', '\160', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\127', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\170', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\166', '\120', '\171', '\040', '\166', '\141', '\040', '\061', - '\012', '\144', '\170', '\113', '\040', '\144', '\145', '\040', '\061', - '\012', '\157', '\120', '\166', '\040', '\157', '\156', '\040', '\061', - '\012', '\162', '\152', '\116', '\040', '\145', '\162', '\040', '\061', - '\012', '\157', '\121', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\167', '\110', '\040', '\166', '\141', '\040', '\061', - '\012', '\121', '\150', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\163', '\125', '\040', '\163', '\164', '\040', '\061', - '\012', '\153', '\107', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\152', '\127', '\040', '\151', '\152', '\040', '\061', - '\012', '\120', '\167', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\102', '\142', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\117', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\160', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\142', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\160', '\115', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\155', '\102', '\040', '\151', '\152', '\040', '\061', - '\012', '\116', '\161', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\131', '\144', '\040', '\163', '\172', '\040', '\061', - '\012', '\131', '\142', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\143', '\127', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\120', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\121', '\171', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\102', '\150', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\107', '\170', '\040', '\156', '\171', '\040', '\061', - '\012', '\161', '\170', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\146', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\155', '\142', '\126', '\040', '\155', '\145', '\040', '\061', - '\012', '\160', '\153', '\131', '\040', '\153', '\141', '\040', '\061', - '\012', '\143', '\127', '\154', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\102', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\117', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\107', '\160', '\142', '\040', '\160', '\162', '\040', '\061', - '\012', '\120', '\160', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\163', '\130', '\040', '\163', '\164', '\040', '\061', - '\012', '\166', '\164', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\103', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\157', '\131', '\040', '\157', '\156', '\040', '\061', - '\012', '\160', '\167', '\121', '\040', '\160', '\162', '\040', '\061', - '\012', '\171', '\107', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\164', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\162', '\132', '\040', '\141', '\156', '\040', '\061', - '\012', '\145', '\126', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\116', '\162', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\164', '\101', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\110', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\147', '\163', '\121', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\154', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\114', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\152', '\103', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\166', '\131', '\040', '\151', '\152', '\040', '\061', - '\012', '\164', '\111', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\166', '\114', '\040', '\166', '\141', '\040', '\061', - '\012', '\110', '\150', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\115', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\115', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\131', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\126', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\131', '\156', '\142', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\155', '\130', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\152', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\121', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\121', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\116', '\146', '\040', '\155', '\145', '\040', '\061', - '\012', '\172', '\146', '\131', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\152', '\123', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\102', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\160', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\112', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\113', '\156', '\172', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\107', '\146', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\132', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\107', '\161', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\125', '\161', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\145', '\127', '\166', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\107', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\163', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\150', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\150', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\170', '\123', '\040', '\156', '\171', '\040', '\061', - '\012', '\162', '\170', '\113', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\116', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\167', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\141', '\116', '\166', '\040', '\141', '\156', '\040', '\061', - '\012', '\121', '\172', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\121', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\172', '\110', '\040', '\163', '\172', '\040', '\061', - '\012', '\122', '\166', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\160', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\130', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\150', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\154', '\142', '\040', '\154', '\145', '\040', '\061', - '\012', '\142', '\156', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\156', '\152', '\113', '\040', '\141', '\156', '\040', '\061', - '\012', '\112', '\152', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\164', '\112', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\167', '\130', '\040', '\151', '\156', '\040', '\061', - '\012', '\156', '\126', '\144', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\172', '\101', '\040', '\163', '\172', '\040', '\061', - '\012', '\165', '\167', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\124', '\163', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\161', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\122', '\156', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\162', '\104', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\116', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\165', '\161', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\113', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\111', '\161', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\110', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\127', '\167', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\115', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\127', '\146', '\040', '\156', '\171', '\040', '\061', - '\012', '\166', '\143', '\117', '\040', '\143', '\150', '\040', '\061', - '\012', '\107', '\153', '\155', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\122', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\115', '\143', '\040', '\156', '\144', '\040', '\061', - '\012', '\132', '\150', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\154', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\125', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\110', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\103', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\121', '\146', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\121', '\153', '\167', '\040', '\153', '\141', '\040', '\061', - '\012', '\155', '\131', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\143', '\125', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\124', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\162', '\152', '\106', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\170', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\116', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\114', '\147', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\106', '\144', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\112', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\143', '\121', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\130', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\167', '\167', '\121', '\040', '\167', '\141', '\040', '\061', - '\012', '\145', '\166', '\121', '\040', '\145', '\162', '\040', '\061', - '\012', '\106', '\143', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\103', '\171', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\160', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\101', '\170', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\107', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\121', '\142', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\166', '\146', '\131', '\040', '\166', '\141', '\040', '\061', - '\012', '\157', '\130', '\144', '\040', '\157', '\156', '\040', '\061', - '\012', '\167', '\101', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\142', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\167', '\155', '\122', '\040', '\155', '\145', '\040', '\061', - '\012', '\162', '\172', '\116', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\143', '\102', '\040', '\143', '\150', '\040', '\061', - '\012', '\102', '\167', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\147', '\123', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\121', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\153', '\112', '\167', '\040', '\153', '\141', '\040', '\061', - '\012', '\142', '\147', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\132', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\146', '\101', '\040', '\167', '\141', '\040', '\061', - '\012', '\152', '\155', '\130', '\040', '\151', '\152', '\040', '\061', - '\012', '\144', '\116', '\160', '\040', '\144', '\145', '\040', '\061', - '\012', '\126', '\170', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\122', '\166', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\132', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\147', '\101', '\040', '\156', '\147', '\040', '\061', - '\012', '\127', '\162', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\143', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\152', '\127', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\120', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\152', '\131', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\125', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\155', '\111', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\110', '\160', '\171', '\040', '\160', '\162', '\040', '\061', - '\012', '\115', '\160', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\153', '\117', '\040', '\153', '\141', '\040', '\061', - '\012', '\101', '\166', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\113', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\102', '\146', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\131', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\105', '\147', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\170', '\110', '\040', '\167', '\141', '\040', '\061', - '\012', '\172', '\110', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\166', '\101', '\040', '\163', '\164', '\040', '\061', - '\012', '\172', '\143', '\120', '\040', '\143', '\150', '\040', '\061', - '\012', '\102', '\170', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\150', '\123', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\114', '\170', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\102', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\127', '\153', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\102', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\167', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\153', '\112', '\040', '\153', '\141', '\040', '\061', - '\012', '\157', '\116', '\152', '\040', '\157', '\156', '\040', '\061', - '\012', '\125', '\147', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\132', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\146', '\120', '\040', '\146', '\157', '\040', '\061', - '\012', '\142', '\131', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\170', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\143', '\111', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\150', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\166', '\120', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\125', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\170', '\103', '\040', '\155', '\145', '\040', '\061', - '\012', '\172', '\120', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\116', '\161', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\146', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\127', '\147', '\160', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\147', '\104', '\040', '\156', '\147', '\040', '\061', - '\012', '\121', '\146', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\143', '\127', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\170', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\160', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\162', '\104', '\040', '\145', '\162', '\040', '\061', - '\012', '\142', '\105', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\142', '\172', '\126', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\167', '\123', '\040', '\167', '\141', '\040', '\061', - '\012', '\155', '\114', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\115', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\106', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\146', '\124', '\040', '\163', '\172', '\040', '\061', - '\012', '\156', '\122', '\153', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\112', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\122', '\155', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\156', '\161', '\122', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\160', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\110', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\124', '\153', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\152', '\107', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\141', '\124', '\040', '\141', '\156', '\040', '\061', - '\012', '\120', '\161', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\154', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\172', '\127', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\106', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\102', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\170', '\117', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\166', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\103', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\121', '\152', '\153', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\102', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\113', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\115', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\122', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\153', '\125', '\040', '\153', '\141', '\040', '\061', - '\012', '\142', '\125', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\131', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\120', '\144', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\157', '\107', '\166', '\040', '\157', '\156', '\040', '\061', - '\012', '\152', '\114', '\171', '\040', '\151', '\152', '\040', '\061', - '\012', '\144', '\165', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\143', '\160', '\040', '\143', '\150', '\040', '\061', - '\012', '\157', '\107', '\170', '\040', '\157', '\156', '\040', '\061', - '\012', '\166', '\107', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\112', '\144', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\151', '\152', '\110', '\040', '\151', '\156', '\040', '\061', - '\012', '\155', '\154', '\130', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\116', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\153', '\103', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\150', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\115', '\166', '\040', '\145', '\162', '\040', '\061', - '\012', '\102', '\147', '\160', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\106', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\127', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\130', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\127', '\143', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\142', '\111', '\040', '\144', '\145', '\040', '\061', - '\012', '\142', '\107', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\145', '\170', '\121', '\040', '\145', '\162', '\040', '\061', - '\012', '\152', '\127', '\152', '\040', '\152', '\157', '\040', '\061', - '\012', '\160', '\121', '\142', '\040', '\160', '\162', '\040', '\061', - '\012', '\152', '\143', '\110', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\117', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\164', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\162', '\103', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\102', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\154', '\172', '\040', '\154', '\145', '\040', '\061', - '\012', '\156', '\110', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\110', '\146', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\130', '\160', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\125', '\170', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\113', '\163', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\127', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\156', '\161', '\132', '\040', '\141', '\156', '\040', '\061', - '\012', '\103', '\170', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\112', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\162', '\127', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\103', '\142', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\161', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\150', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\125', '\146', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\125', '\170', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\112', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\166', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\150', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\103', '\166', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\141', '\120', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\112', '\170', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\104', '\167', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\111', '\170', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\153', '\146', '\123', '\040', '\153', '\141', '\040', '\061', - '\012', '\162', '\132', '\155', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\155', '\105', '\040', '\155', '\145', '\040', '\061', - '\012', '\163', '\114', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\155', '\122', '\040', '\155', '\145', '\040', '\061', - '\012', '\165', '\103', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\106', '\155', '\040', '\153', '\141', '\040', '\061', - '\012', '\113', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\121', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\123', '\146', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\147', '\125', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\166', '\124', '\040', '\166', '\141', '\040', '\061', - '\012', '\155', '\121', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\107', '\142', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\142', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\121', '\153', '\040', '\154', '\145', '\040', '\061', - '\012', '\143', '\111', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\124', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\121', '\147', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\131', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\161', '\120', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\117', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\116', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\146', '\112', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\110', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\153', '\102', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\144', '\105', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\120', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\154', '\126', '\166', '\040', '\154', '\145', '\040', '\061', - '\012', '\155', '\120', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\122', '\155', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\157', '\105', '\040', '\157', '\156', '\040', '\061', - '\012', '\150', '\156', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\166', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\157', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\143', '\130', '\040', '\143', '\150', '\040', '\061', - '\012', '\156', '\155', '\104', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\143', '\130', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\104', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\147', '\111', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\126', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\164', '\104', '\150', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\110', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\153', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\170', '\124', '\040', '\160', '\162', '\040', '\061', - '\012', '\170', '\131', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\162', '\124', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\125', '\142', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\114', '\154', '\155', '\040', '\154', '\145', '\040', '\061', - '\012', '\171', '\152', '\132', '\040', '\151', '\152', '\040', '\061', - '\012', '\121', '\163', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\143', '\146', '\115', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\142', '\107', '\040', '\142', '\145', '\040', '\061', - '\012', '\112', '\146', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\155', '\127', '\142', '\040', '\155', '\145', '\040', '\061', - '\012', '\152', '\104', '\160', '\040', '\151', '\152', '\040', '\061', - '\012', '\154', '\127', '\172', '\040', '\154', '\145', '\040', '\061', - '\012', '\143', '\130', '\171', '\040', '\143', '\150', '\040', '\061', - '\012', '\157', '\121', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\165', '\143', '\132', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\166', '\116', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\166', '\113', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\104', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\114', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\144', '\104', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\150', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\155', '\113', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\114', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\161', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\102', '\146', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\101', '\143', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\143', '\107', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\112', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\146', '\123', '\040', '\155', '\145', '\040', '\061', - '\012', '\144', '\162', '\114', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\171', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\121', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\162', '\114', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\143', '\112', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\160', '\130', '\040', '\160', '\162', '\040', '\061', - '\012', '\132', '\172', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\163', '\156', '\125', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\105', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\121', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\120', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\112', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\160', '\125', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\172', '\115', '\040', '\163', '\172', '\040', '\061', - '\012', '\165', '\132', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\167', '\125', '\040', '\167', '\141', '\040', '\061', - '\012', '\122', '\152', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\150', '\113', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\102', '\146', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\167', '\165', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\166', '\115', '\040', '\166', '\141', '\040', '\061', - '\012', '\171', '\151', '\127', '\040', '\151', '\156', '\040', '\061', - '\012', '\150', '\161', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\125', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\102', '\144', '\040', '\154', '\145', '\040', '\061', - '\012', '\132', '\170', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\160', '\127', '\040', '\160', '\162', '\040', '\061', - '\012', '\162', '\110', '\155', '\040', '\145', '\162', '\040', '\061', - '\012', '\155', '\150', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\115', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\166', '\127', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\106', '\144', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\107', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\104', '\150', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\152', '\122', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\166', '\104', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\166', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\155', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\103', '\152', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\153', '\130', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\153', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\127', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\115', '\163', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\116', '\166', '\040', '\141', '\156', '\040', '\061', - '\012', '\110', '\172', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\162', '\131', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\147', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\167', '\102', '\040', '\160', '\162', '\040', '\061', - '\012', '\112', '\170', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\143', '\112', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\131', '\167', '\040', '\163', '\164', '\040', '\061', - '\012', '\124', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\145', '\112', '\146', '\040', '\154', '\145', '\040', '\061', - '\012', '\143', '\172', '\112', '\040', '\143', '\150', '\040', '\061', - '\012', '\121', '\171', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\166', '\126', '\040', '\166', '\141', '\040', '\061', - '\012', '\130', '\171', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\131', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\102', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\152', '\166', '\122', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\142', '\110', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\147', '\110', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\142', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\167', '\125', '\040', '\154', '\145', '\040', '\061', - '\012', '\164', '\112', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\111', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\126', '\152', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\104', '\147', '\155', '\040', '\156', '\147', '\040', '\061', - '\012', '\156', '\166', '\122', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\122', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\146', '\117', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\105', '\143', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\132', '\162', '\146', '\040', '\145', '\162', '\040', '\061', - '\012', '\155', '\170', '\104', '\040', '\155', '\145', '\040', '\061', - '\012', '\111', '\161', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\102', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\124', '\163', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\161', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\103', '\166', '\040', '\153', '\141', '\040', '\061', - '\012', '\156', '\126', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\107', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\147', '\121', '\040', '\143', '\150', '\040', '\061', - '\012', '\120', '\160', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\112', '\143', '\144', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\150', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\114', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\131', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\160', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\163', '\146', '\105', '\040', '\163', '\164', '\040', '\061', - '\012', '\167', '\170', '\122', '\040', '\167', '\141', '\040', '\061', - '\012', '\160', '\106', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\131', '\155', '\146', '\040', '\155', '\145', '\040', '\061', - '\012', '\112', '\147', '\171', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\166', '\111', '\040', '\166', '\141', '\040', '\061', - '\012', '\116', '\143', '\172', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\102', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\162', '\126', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\152', '\166', '\130', '\040', '\151', '\152', '\040', '\061', - '\012', '\156', '\131', '\160', '\040', '\141', '\156', '\040', '\061', - '\012', '\156', '\116', '\142', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\121', '\151', '\040', '\143', '\150', '\040', '\061', - '\012', '\121', '\167', '\171', '\040', '\167', '\141', '\040', '\061', - '\012', '\166', '\120', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\166', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\153', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\155', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\144', '\131', '\040', '\156', '\147', '\040', '\061', - '\012', '\113', '\152', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\163', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\112', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\104', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\166', '\106', '\040', '\153', '\141', '\040', '\061', - '\012', '\153', '\127', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\131', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\145', '\115', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\131', '\171', '\040', '\155', '\145', '\040', '\061', - '\012', '\110', '\170', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\142', '\115', '\040', '\160', '\162', '\040', '\061', - '\012', '\110', '\167', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\155', '\127', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\116', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\121', '\152', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\141', '\161', '\104', '\040', '\141', '\156', '\040', '\061', - '\012', '\107', '\143', '\144', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\164', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\161', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\125', '\152', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\166', '\115', '\040', '\166', '\141', '\040', '\061', - '\012', '\110', '\150', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\127', '\144', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\131', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\127', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\154', '\117', '\040', '\154', '\145', '\040', '\061', - '\012', '\143', '\156', '\130', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\115', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\113', '\142', '\040', '\160', '\162', '\040', '\061', - '\012', '\167', '\157', '\126', '\040', '\157', '\156', '\040', '\061', - '\012', '\146', '\172', '\107', '\040', '\163', '\172', '\040', '\061', - '\012', '\114', '\161', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\145', '\117', '\152', '\040', '\145', '\162', '\040', '\061', - '\012', '\107', '\164', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\154', '\130', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\144', '\103', '\040', '\144', '\145', '\040', '\061', - '\012', '\143', '\146', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\113', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\112', '\151', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\123', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\147', '\124', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\143', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\116', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\160', '\102', '\040', '\160', '\162', '\040', '\061', - '\012', '\166', '\120', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\155', '\101', '\040', '\151', '\152', '\040', '\061', - '\012', '\144', '\170', '\111', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\107', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\102', '\166', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\162', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\120', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\121', '\155', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\161', '\103', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\106', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\164', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\103', '\161', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\103', '\144', '\040', '\145', '\162', '\040', '\061', - '\012', '\132', '\155', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\144', '\126', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\167', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\167', '\120', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\126', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\116', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\130', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\115', '\142', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\166', '\107', '\040', '\166', '\145', '\040', '\061', - '\012', '\126', '\160', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\171', '\130', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\154', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\131', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\106', '\142', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\143', '\126', '\040', '\143', '\150', '\040', '\061', - '\012', '\162', '\121', '\153', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\164', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\145', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\145', '\107', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\115', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\161', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\161', '\144', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\114', '\146', '\040', '\160', '\157', '\040', '\061', - '\012', '\170', '\166', '\117', '\040', '\166', '\141', '\040', '\061', - '\012', '\162', '\146', '\110', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\111', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\120', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\103', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\126', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\151', '\161', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\163', '\112', '\040', '\163', '\164', '\040', '\061', - '\012', '\126', '\167', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\132', '\156', '\155', '\040', '\141', '\156', '\040', '\061', - '\012', '\131', '\162', '\172', '\040', '\145', '\162', '\040', '\061', - '\012', '\122', '\166', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\172', '\113', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\142', '\127', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\153', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\153', '\120', '\040', '\153', '\141', '\040', '\061', - '\012', '\153', '\172', '\123', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\130', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\170', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\106', '\167', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\154', '\110', '\163', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\162', '\102', '\040', '\145', '\162', '\040', '\061', - '\012', '\152', '\116', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\110', '\170', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\107', '\146', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\105', '\147', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\112', '\170', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\164', '\126', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\167', '\121', '\040', '\167', '\141', '\040', '\061', - '\012', '\147', '\111', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\127', '\161', '\165', '\040', '\165', '\156', '\040', '\061', - '\012', '\152', '\166', '\111', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\107', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\123', '\142', '\040', '\153', '\141', '\040', '\061', - '\012', '\150', '\170', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\110', '\155', '\040', '\163', '\172', '\040', '\061', - '\012', '\112', '\160', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\126', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\125', '\153', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\162', '\170', '\106', '\040', '\145', '\162', '\040', '\061', - '\012', '\144', '\126', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\144', '\130', '\040', '\163', '\164', '\040', '\061', - '\012', '\155', '\152', '\115', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\167', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\117', '\147', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\150', '\162', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\146', '\101', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\142', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\146', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\172', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\110', '\146', '\040', '\151', '\156', '\040', '\061', - '\012', '\152', '\170', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\155', '\120', '\040', '\166', '\141', '\040', '\061', - '\012', '\142', '\166', '\111', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\155', '\110', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\164', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\166', '\121', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\172', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\126', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\130', '\155', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\130', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\146', '\104', '\040', '\160', '\162', '\040', '\061', - '\012', '\146', '\103', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\142', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\132', '\150', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\113', '\167', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\162', '\143', '\112', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\154', '\124', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\172', '\115', '\040', '\163', '\172', '\040', '\061', - '\012', '\162', '\160', '\120', '\040', '\145', '\162', '\040', '\061', - '\012', '\164', '\155', '\101', '\040', '\164', '\150', '\040', '\061', - '\012', '\141', '\131', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\102', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\150', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\114', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\113', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\144', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\142', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\144', '\110', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\152', '\150', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\102', '\163', '\166', '\040', '\163', '\164', '\040', '\061', - '\012', '\162', '\132', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\150', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\167', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\130', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\166', '\124', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\151', '\103', '\040', '\151', '\156', '\040', '\061', - '\012', '\147', '\153', '\124', '\040', '\156', '\147', '\040', '\061', - '\012', '\156', '\112', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\160', '\126', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\120', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\126', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\102', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\122', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\122', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\147', '\101', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\115', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\112', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\110', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\103', '\153', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\143', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\111', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\167', '\161', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\115', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\161', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\132', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\151', '\161', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\161', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\157', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\113', '\156', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\121', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\165', '\165', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\172', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\120', '\170', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\121', '\147', '\146', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\106', '\167', '\040', '\163', '\164', '\040', '\061', - '\012', '\147', '\110', '\146', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\147', '\116', '\040', '\156', '\147', '\040', '\061', - '\012', '\162', '\103', '\167', '\040', '\145', '\162', '\040', '\061', - '\012', '\131', '\152', '\171', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\156', '\126', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\142', '\123', '\040', '\142', '\145', '\040', '\061', - '\012', '\151', '\110', '\172', '\040', '\151', '\156', '\040', '\061', - '\012', '\153', '\107', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\153', '\167', '\123', '\040', '\153', '\141', '\040', '\061', - '\012', '\163', '\104', '\155', '\040', '\163', '\164', '\040', '\061', - '\012', '\126', '\150', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\150', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\142', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\160', '\127', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\166', '\121', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\116', '\155', '\040', '\166', '\141', '\040', '\061', - '\012', '\154', '\131', '\167', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\110', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\132', '\172', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\104', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\143', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\112', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\121', '\167', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\106', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\155', '\117', '\040', '\155', '\145', '\040', '\061', - '\012', '\102', '\166', '\171', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\147', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\131', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\170', '\167', '\106', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\167', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\105', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\127', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\172', '\117', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\120', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\156', '\127', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\107', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\153', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\130', '\162', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\112', '\144', '\040', '\156', '\147', '\040', '\061', - '\012', '\114', '\154', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\161', '\165', '\040', '\165', '\156', '\040', '\061', - '\012', '\146', '\147', '\110', '\040', '\156', '\147', '\040', '\061', - '\012', '\126', '\143', '\171', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\126', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\167', '\132', '\040', '\145', '\162', '\040', '\061', - '\012', '\130', '\154', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\112', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\106', '\156', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\131', '\160', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\154', '\150', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\141', '\125', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\154', '\102', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\144', '\154', '\127', '\040', '\154', '\145', '\040', '\061', - '\012', '\160', '\166', '\126', '\040', '\166', '\141', '\040', '\061', - '\012', '\115', '\167', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\132', '\167', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\143', '\125', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\126', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\143', '\125', '\040', '\143', '\150', '\040', '\061', - '\012', '\114', '\143', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\162', '\166', '\121', '\040', '\145', '\162', '\040', '\061', - '\012', '\145', '\131', '\155', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\103', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\102', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\111', '\167', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\115', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\150', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\104', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\126', '\150', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\112', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\117', '\150', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\104', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\124', '\156', '\040', '\164', '\150', '\040', '\061', - '\012', '\145', '\161', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\112', '\162', '\040', '\156', '\147', '\040', '\061', - '\012', '\132', '\160', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\167', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\147', '\131', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\144', '\126', '\040', '\163', '\164', '\040', '\061', - '\012', '\154', '\152', '\126', '\040', '\154', '\145', '\040', '\061', - '\012', '\171', '\107', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\165', '\127', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\142', '\117', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\144', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\112', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\156', '\167', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\101', '\160', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\143', '\113', '\040', '\143', '\150', '\040', '\061', - '\012', '\121', '\167', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\157', '\171', '\121', '\040', '\157', '\156', '\040', '\061', - '\012', '\154', '\120', '\167', '\040', '\154', '\145', '\040', '\061', - '\012', '\143', '\131', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\162', '\107', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\153', '\124', '\040', '\153', '\141', '\040', '\061', - '\012', '\144', '\125', '\152', '\040', '\144', '\145', '\040', '\061', - '\012', '\162', '\150', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\120', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\170', '\157', '\106', '\040', '\157', '\156', '\040', '\061', - '\012', '\150', '\131', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\131', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\120', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\103', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\112', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\104', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\126', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\167', '\127', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\114', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\141', '\102', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\104', '\166', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\164', '\113', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\146', '\107', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\115', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\142', '\114', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\170', '\167', '\127', '\040', '\167', '\141', '\040', '\061', - '\012', '\142', '\172', '\110', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\111', '\167', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\144', '\116', '\040', '\163', '\172', '\040', '\061', - '\012', '\107', '\147', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\154', '\167', '\126', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\171', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\102', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\117', '\167', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\114', '\164', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\161', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\152', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\172', '\131', '\040', '\163', '\172', '\040', '\061', - '\012', '\112', '\144', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\153', '\115', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\104', '\144', '\152', '\040', '\144', '\145', '\040', '\061', - '\012', '\164', '\146', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\161', '\124', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\165', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\110', '\142', '\040', '\160', '\157', '\040', '\061', - '\012', '\166', '\122', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\171', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\160', '\131', '\040', '\153', '\141', '\040', '\061', - '\012', '\166', '\161', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\116', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\127', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\142', '\112', '\040', '\156', '\147', '\040', '\061', - '\012', '\157', '\132', '\167', '\040', '\157', '\156', '\040', '\061', - '\012', '\143', '\102', '\172', '\040', '\143', '\150', '\040', '\061', - '\012', '\120', '\166', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\154', '\152', '\111', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\166', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\167', '\131', '\040', '\153', '\141', '\040', '\061', - '\012', '\150', '\102', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\144', '\116', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\170', '\110', '\040', '\156', '\171', '\040', '\061', - '\012', '\146', '\170', '\110', '\040', '\146', '\157', '\040', '\061', - '\012', '\164', '\130', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\102', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\112', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\170', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\152', '\113', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\161', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\115', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\126', '\170', '\040', '\154', '\145', '\040', '\061', - '\012', '\122', '\150', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\104', '\156', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\153', '\166', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\155', '\102', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\141', '\131', '\040', '\141', '\156', '\040', '\061', - '\012', '\111', '\166', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\155', '\120', '\040', '\155', '\145', '\040', '\061', - '\012', '\142', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\155', '\125', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\154', '\103', '\040', '\154', '\145', '\040', '\061', - '\012', '\113', '\162', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\151', '\126', '\166', '\040', '\151', '\156', '\040', '\061', - '\012', '\132', '\167', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\120', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\125', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\120', '\144', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\121', '\172', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\157', '\125', '\040', '\157', '\156', '\040', '\061', - '\012', '\170', '\112', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\125', '\144', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\167', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\113', '\166', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\121', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\122', '\144', '\153', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\111', '\152', '\040', '\163', '\164', '\040', '\061', - '\012', '\107', '\147', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\116', '\167', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\166', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\161', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\130', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\161', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\155', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\124', '\147', '\144', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\160', '\117', '\040', '\160', '\157', '\040', '\061', - '\012', '\164', '\105', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\102', '\161', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\146', '\114', '\040', '\167', '\141', '\040', '\061', - '\012', '\166', '\131', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\104', '\170', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\127', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\172', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\121', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\124', '\164', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\126', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\122', '\161', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\127', '\143', '\156', '\040', '\143', '\150', '\040', '\061', - '\012', '\116', '\167', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\157', '\112', '\040', '\157', '\156', '\040', '\061', - '\012', '\166', '\104', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\150', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\112', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\120', '\170', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\162', '\106', '\142', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\154', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\153', '\130', '\040', '\153', '\141', '\040', '\061', - '\012', '\156', '\156', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\130', '\146', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\142', '\132', '\040', '\163', '\164', '\040', '\061', - '\012', '\131', '\171', '\146', '\040', '\156', '\171', '\040', '\061', - '\012', '\102', '\152', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\111', '\154', '\170', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\160', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\115', '\161', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\161', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\116', '\166', '\040', '\163', '\164', '\040', '\061', - '\012', '\132', '\166', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\123', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\166', '\102', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\166', '\132', '\040', '\166', '\141', '\040', '\061', - '\012', '\125', '\157', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\106', '\152', '\171', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\113', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\166', '\111', '\040', '\166', '\141', '\040', '\061', - '\012', '\132', '\154', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\144', '\105', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\160', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\154', '\150', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\161', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\152', '\107', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\114', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\160', '\112', '\040', '\160', '\162', '\040', '\061', - '\012', '\167', '\172', '\126', '\040', '\163', '\172', '\040', '\061', - '\012', '\110', '\147', '\161', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\150', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\114', '\166', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\150', '\162', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\165', '\131', '\040', '\165', '\156', '\040', '\061', - '\012', '\152', '\161', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\165', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\106', '\172', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\172', '\107', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\106', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\146', '\105', '\040', '\166', '\141', '\040', '\061', - '\012', '\111', '\147', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\161', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\131', '\142', '\040', '\156', '\147', '\040', '\061', - '\012', '\154', '\112', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\143', '\117', '\040', '\143', '\150', '\040', '\061', - '\012', '\121', '\166', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\124', '\161', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\144', '\131', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\165', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\110', '\167', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\122', '\155', '\040', '\163', '\172', '\040', '\061', - '\012', '\110', '\147', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\120', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\161', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\113', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\160', '\101', '\040', '\160', '\162', '\040', '\061', - '\012', '\142', '\153', '\111', '\040', '\153', '\141', '\040', '\061', - '\012', '\142', '\123', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\170', '\127', '\040', '\155', '\145', '\040', '\061', - '\012', '\155', '\152', '\122', '\040', '\151', '\152', '\040', '\061', - '\012', '\117', '\151', '\160', '\040', '\151', '\156', '\040', '\061', - '\012', '\167', '\171', '\131', '\040', '\167', '\141', '\040', '\061', - '\012', '\144', '\106', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\104', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\130', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\126', '\142', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\152', '\171', '\116', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\166', '\120', '\040', '\166', '\141', '\040', '\061', - '\012', '\171', '\126', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\141', '\127', '\155', '\040', '\141', '\156', '\040', '\061', - '\012', '\107', '\152', '\153', '\040', '\151', '\152', '\040', '\061', - '\012', '\101', '\160', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\132', '\163', '\167', '\040', '\163', '\164', '\040', '\061', - '\012', '\152', '\121', '\166', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\142', '\124', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\144', '\102', '\040', '\144', '\145', '\040', '\061', - '\012', '\153', '\143', '\131', '\040', '\143', '\150', '\040', '\061', - '\012', '\162', '\161', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\170', '\104', '\040', '\142', '\145', '\040', '\061', - '\012', '\166', '\154', '\170', '\040', '\154', '\145', '\040', '\061', - '\012', '\153', '\152', '\112', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\161', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\170', '\105', '\040', '\163', '\172', '\040', '\061', - '\012', '\163', '\110', '\146', '\040', '\163', '\164', '\040', '\061', - '\012', '\152', '\165', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\167', '\130', '\040', '\153', '\141', '\040', '\061', - '\012', '\157', '\161', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\127', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\110', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\110', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\112', '\152', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\142', '\101', '\040', '\142', '\145', '\040', '\061', - '\012', '\122', '\161', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\111', '\152', '\171', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\123', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\126', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\162', '\121', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\155', '\113', '\040', '\155', '\145', '\040', '\061', - '\012', '\146', '\156', '\101', '\040', '\141', '\156', '\040', '\061', - '\012', '\120', '\150', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\150', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\170', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\126', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\161', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\150', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\163', '\106', '\040', '\163', '\164', '\040', '\061', - '\012', '\164', '\131', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\172', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\116', '\146', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\161', '\130', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\112', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\154', '\130', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\132', '\160', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\124', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\160', '\110', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\131', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\142', '\102', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\166', '\105', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\111', '\151', '\040', '\161', '\165', '\040', '\061', - '\012', '\106', '\144', '\153', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\116', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\117', '\146', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\130', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\155', '\166', '\132', '\040', '\166', '\141', '\040', '\061', - '\012', '\103', '\152', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\106', '\155', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\160', '\153', '\122', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\146', '\132', '\040', '\163', '\172', '\040', '\061', - '\012', '\132', '\160', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\143', '\142', '\101', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\166', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\114', '\155', '\160', '\040', '\155', '\145', '\040', '\061', - '\012', '\147', '\106', '\144', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\106', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\106', '\152', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\152', '\106', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\152', '\166', '\040', '\151', '\152', '\040', '\061', - '\012', '\144', '\142', '\124', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\155', '\121', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\106', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\143', '\104', '\153', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\106', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\107', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\150', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\164', '\154', '\040', '\164', '\150', '\040', '\061', - '\012', '\141', '\172', '\126', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\112', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\115', '\170', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\166', '\147', '\113', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\167', '\121', '\040', '\143', '\150', '\040', '\061', - '\012', '\107', '\156', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\154', '\142', '\120', '\040', '\154', '\145', '\040', '\061', - '\012', '\153', '\144', '\123', '\040', '\144', '\145', '\040', '\061', - '\012', '\153', '\104', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\120', '\166', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\110', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\114', '\147', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\155', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\166', '\101', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\125', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\152', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\104', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\170', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\107', '\146', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\142', '\131', '\040', '\156', '\147', '\040', '\061', - '\012', '\123', '\152', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\117', '\147', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\107', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\164', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\167', '\110', '\040', '\156', '\147', '\040', '\061', - '\012', '\115', '\167', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\166', '\125', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\162', '\107', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\115', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\131', '\144', '\166', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\153', '\132', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\152', '\114', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\120', '\170', '\040', '\156', '\171', '\040', '\061', - '\012', '\144', '\162', '\130', '\040', '\145', '\162', '\040', '\061', - '\012', '\152', '\170', '\122', '\040', '\151', '\152', '\040', '\061', - '\012', '\150', '\131', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\110', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\162', '\120', '\040', '\145', '\162', '\040', '\061', - '\012', '\164', '\143', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\112', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\125', '\144', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\130', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\104', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\102', '\152', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\106', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\155', '\170', '\107', '\040', '\155', '\145', '\040', '\061', - '\012', '\170', '\117', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\150', '\147', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\160', '\104', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\150', '\123', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\161', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\116', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\110', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\132', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\152', '\171', '\040', '\151', '\152', '\040', '\061', - '\012', '\124', '\146', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\116', '\167', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\172', '\121', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\122', '\153', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\121', '\166', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\154', '\112', '\040', '\154', '\145', '\040', '\061', - '\012', '\143', '\106', '\160', '\040', '\143', '\150', '\040', '\061', - '\012', '\157', '\104', '\142', '\040', '\157', '\156', '\040', '\061', - '\012', '\154', '\163', '\131', '\040', '\154', '\145', '\040', '\061', - '\012', '\132', '\142', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\103', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\170', '\116', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\121', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\113', '\152', '\171', '\040', '\151', '\152', '\040', '\061', - '\012', '\117', '\166', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\143', '\170', '\101', '\040', '\143', '\150', '\040', '\061', - '\012', '\110', '\161', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\167', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\107', '\166', '\040', '\163', '\164', '\040', '\061', - '\012', '\122', '\167', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\166', '\110', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\126', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\172', '\155', '\130', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\144', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\112', '\166', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\104', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\126', '\150', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\114', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\166', '\103', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\126', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\110', '\146', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\164', '\121', '\154', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\150', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\157', '\161', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\171', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\132', '\146', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\113', '\171', '\040', '\142', '\145', '\040', '\061', - '\012', '\164', '\152', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\153', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\152', '\166', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\147', '\116', '\040', '\156', '\147', '\040', '\061', - '\012', '\154', '\116', '\155', '\040', '\154', '\145', '\040', '\061', - '\012', '\112', '\172', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\114', '\167', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\166', '\143', '\114', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\130', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\164', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\112', '\170', '\040', '\156', '\171', '\040', '\061', - '\012', '\156', '\160', '\126', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\167', '\107', '\040', '\163', '\164', '\040', '\061', - '\012', '\163', '\130', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\145', '\112', '\142', '\040', '\145', '\162', '\040', '\061', - '\012', '\144', '\143', '\122', '\040', '\143', '\150', '\040', '\061', - '\012', '\132', '\162', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\120', '\147', '\166', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\131', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\152', '\154', '\111', '\040', '\154', '\145', '\040', '\061', - '\012', '\106', '\155', '\146', '\040', '\155', '\145', '\040', '\061', - '\012', '\107', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\154', '\132', '\040', '\154', '\145', '\040', '\061', - '\012', '\103', '\163', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\121', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\114', '\155', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\167', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\121', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\146', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\122', '\167', '\040', '\145', '\162', '\040', '\061', - '\012', '\141', '\125', '\157', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\160', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\120', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\110', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\147', '\161', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\127', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\102', '\161', '\040', '\142', '\145', '\040', '\061', - '\012', '\167', '\127', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\143', '\146', '\113', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\127', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\162', '\166', '\126', '\040', '\145', '\162', '\040', '\061', - '\012', '\172', '\150', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\113', '\154', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\142', '\121', '\040', '\143', '\150', '\040', '\061', - '\012', '\112', '\155', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\120', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\121', '\156', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\115', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\141', '\106', '\172', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\112', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\120', '\167', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\143', '\114', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\155', '\121', '\040', '\156', '\147', '\040', '\061', - '\012', '\131', '\161', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\103', '\147', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\161', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\156', '\111', '\040', '\156', '\164', '\040', '\061', - '\012', '\161', '\117', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\171', '\125', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\121', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\125', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\102', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\116', '\155', '\040', '\144', '\145', '\040', '\061', - '\012', '\105', '\167', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\171', '\160', '\104', '\040', '\160', '\162', '\040', '\061', - '\012', '\167', '\170', '\114', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\145', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\153', '\102', '\040', '\153', '\141', '\040', '\061', - '\012', '\152', '\102', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\125', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\121', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\167', '\117', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\121', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\162', '\154', '\040', '\145', '\162', '\040', '\061', - '\012', '\144', '\124', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\127', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\170', '\113', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\110', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\143', '\131', '\040', '\143', '\150', '\040', '\061', - '\012', '\157', '\112', '\163', '\040', '\157', '\156', '\040', '\061', - '\012', '\163', '\122', '\170', '\040', '\163', '\164', '\040', '\061', - '\012', '\165', '\121', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\150', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\144', '\116', '\040', '\163', '\164', '\040', '\061', - '\012', '\155', '\170', '\122', '\040', '\155', '\145', '\040', '\061', - '\012', '\130', '\163', '\166', '\040', '\163', '\164', '\040', '\061', - '\012', '\120', '\143', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\153', '\132', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\104', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\162', '\111', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\156', '\166', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\160', '\101', '\040', '\151', '\152', '\040', '\061', - '\012', '\150', '\132', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\156', '\144', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\132', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\162', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\123', '\142', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\164', '\127', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\160', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\110', '\152', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\143', '\123', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\120', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\110', '\164', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\143', '\107', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\132', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\172', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\113', '\147', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\141', '\125', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\131', '\155', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\143', '\131', '\040', '\143', '\150', '\040', '\061', - '\012', '\157', '\126', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\144', '\115', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\172', '\113', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\162', '\130', '\040', '\145', '\162', '\040', '\061', - '\012', '\171', '\144', '\126', '\040', '\144', '\145', '\040', '\061', - '\012', '\165', '\161', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\155', '\116', '\040', '\155', '\145', '\040', '\061', - '\012', '\117', '\143', '\147', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\114', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\143', '\112', '\163', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\107', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\115', '\153', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\124', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\116', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\110', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\165', '\127', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\170', '\114', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\170', '\107', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\126', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\116', '\142', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\103', '\170', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\143', '\166', '\107', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\103', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\153', '\152', '\103', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\146', '\131', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\143', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\160', '\127', '\040', '\144', '\145', '\040', '\061', - '\012', '\120', '\161', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\154', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\111', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\161', '\170', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\113', '\152', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\132', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\106', '\153', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\147', '\127', '\142', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\161', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\154', '\166', '\040', '\154', '\145', '\040', '\061', - '\012', '\153', '\103', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\167', '\150', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\117', '\167', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\113', '\155', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\161', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\107', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\103', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\155', '\121', '\040', '\155', '\145', '\040', '\061', - '\012', '\170', '\156', '\106', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\165', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\106', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\171', '\123', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\152', '\130', '\040', '\151', '\152', '\040', '\061', - '\012', '\154', '\117', '\152', '\040', '\154', '\145', '\040', '\061', - '\012', '\112', '\155', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\132', '\166', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\161', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\124', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\117', '\151', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\112', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\115', '\152', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\124', '\160', '\142', '\040', '\160', '\162', '\040', '\061', - '\012', '\127', '\164', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\170', '\117', '\040', '\151', '\152', '\040', '\061', - '\012', '\144', '\102', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\164', '\116', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\124', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\156', '\125', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\104', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\123', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\122', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\125', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\102', '\142', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\152', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\111', '\171', '\040', '\163', '\164', '\040', '\061', - '\012', '\144', '\103', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\111', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\132', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\161', '\104', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\162', '\115', '\040', '\145', '\162', '\040', '\061', - '\012', '\165', '\117', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\147', '\117', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\162', '\130', '\040', '\156', '\147', '\040', '\061', - '\012', '\120', '\147', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\126', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\105', '\165', '\040', '\165', '\156', '\040', '\061', - '\012', '\153', '\102', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\123', '\147', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\152', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\117', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\155', '\127', '\040', '\155', '\145', '\040', '\061', - '\012', '\107', '\156', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\132', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\124', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\107', '\146', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\114', '\146', '\040', '\163', '\164', '\040', '\061', - '\012', '\120', '\147', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\167', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\104', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\144', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\163', '\132', '\040', '\163', '\164', '\040', '\061', - '\012', '\166', '\143', '\103', '\040', '\143', '\150', '\040', '\061', - '\012', '\104', '\143', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\125', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\111', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\162', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\142', '\123', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\172', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\127', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\166', '\103', '\040', '\166', '\141', '\040', '\061', - '\012', '\112', '\162', '\167', '\040', '\145', '\162', '\040', '\061', - '\012', '\171', '\170', '\111', '\040', '\156', '\171', '\040', '\061', - '\012', '\144', '\161', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\103', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\130', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\127', '\144', '\160', '\040', '\144', '\145', '\040', '\061', - '\012', '\104', '\172', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\144', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\142', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\167', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\127', '\161', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\151', '\130', '\167', '\040', '\151', '\156', '\040', '\061', - '\012', '\146', '\131', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\165', '\121', '\040', '\165', '\156', '\040', '\061', - '\012', '\153', '\152', '\104', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\111', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\127', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\157', '\103', '\167', '\040', '\157', '\156', '\040', '\061', - '\012', '\132', '\143', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\144', '\116', '\040', '\144', '\145', '\040', '\061', - '\012', '\165', '\131', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\123', '\162', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\160', '\147', '\125', '\040', '\156', '\147', '\040', '\061', - '\012', '\162', '\121', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\110', '\146', '\040', '\155', '\145', '\040', '\061', - '\012', '\146', '\102', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\126', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\131', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\126', '\147', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\141', '\123', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\170', '\127', '\040', '\160', '\162', '\040', '\061', - '\012', '\155', '\156', '\112', '\040', '\141', '\156', '\040', '\061', - '\012', '\102', '\167', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\124', '\161', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\106', '\166', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\167', '\115', '\040', '\167', '\141', '\040', '\061', - '\012', '\104', '\161', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\167', '\111', '\040', '\155', '\145', '\040', '\061', - '\012', '\166', '\150', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\161', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\154', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\141', '\102', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\156', '\132', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\130', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\103', '\152', '\040', '\163', '\164', '\040', '\061', - '\012', '\147', '\162', '\116', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\131', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\167', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\131', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\142', '\164', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\121', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\132', '\154', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\112', '\172', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\142', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\114', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\154', '\170', '\040', '\154', '\145', '\040', '\061', - '\012', '\116', '\155', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\150', '\143', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\162', '\153', '\040', '\145', '\162', '\040', '\061', - '\012', '\116', '\150', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\161', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\152', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\151', '\112', '\144', '\040', '\151', '\156', '\040', '\061', - '\012', '\144', '\114', '\146', '\040', '\144', '\145', '\040', '\061', - '\012', '\143', '\121', '\156', '\040', '\143', '\150', '\040', '\061', - '\012', '\127', '\146', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\150', '\153', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\150', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\115', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\114', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\130', '\147', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\113', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\152', '\112', '\040', '\151', '\152', '\040', '\061', - '\012', '\162', '\112', '\155', '\040', '\145', '\162', '\040', '\061', - '\012', '\126', '\170', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\102', '\170', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\156', '\121', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\153', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\116', '\154', '\167', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\127', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\144', '\125', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\164', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\111', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\145', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\162', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\116', '\150', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\104', '\160', '\040', '\160', '\157', '\040', '\061', - '\012', '\103', '\156', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\170', '\125', '\040', '\153', '\141', '\040', '\061', - '\012', '\102', '\161', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\130', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\153', '\102', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\102', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\115', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\153', '\170', '\122', '\040', '\153', '\141', '\040', '\061', - '\012', '\114', '\172', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\102', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\152', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\160', '\103', '\040', '\160', '\162', '\040', '\061', - '\012', '\146', '\113', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\150', '\167', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\161', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\102', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\143', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\116', '\156', '\163', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\155', '\132', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\113', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\161', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\102', '\152', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\107', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\114', '\156', '\160', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\150', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\120', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\115', '\170', '\040', '\156', '\171', '\040', '\061', - '\012', '\167', '\105', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\155', '\112', '\040', '\153', '\141', '\040', '\061', - '\012', '\121', '\163', '\170', '\040', '\163', '\164', '\040', '\061', - '\012', '\154', '\103', '\167', '\040', '\154', '\145', '\040', '\061', - '\012', '\121', '\161', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\166', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\153', '\116', '\040', '\153', '\141', '\040', '\061', - '\012', '\165', '\126', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\121', '\155', '\040', '\163', '\164', '\040', '\061', - '\012', '\165', '\112', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\172', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\130', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\162', '\111', '\040', '\145', '\162', '\040', '\061', - '\012', '\164', '\102', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\122', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\111', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\152', '\110', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\106', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\167', '\112', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\144', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\113', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\163', '\110', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\102', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\104', '\171', '\040', '\151', '\152', '\040', '\061', - '\012', '\107', '\152', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\106', '\153', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\110', '\150', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\123', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\106', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\166', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\122', '\167', '\040', '\157', '\156', '\040', '\061', - '\012', '\170', '\147', '\130', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\152', '\106', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\104', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\143', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\143', '\167', '\040', '\143', '\150', '\040', '\061', - '\012', '\156', '\146', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\107', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\107', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\170', '\126', '\040', '\146', '\157', '\040', '\061', - '\012', '\151', '\120', '\152', '\040', '\151', '\156', '\040', '\061', - '\012', '\161', '\147', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\111', '\166', '\040', '\151', '\152', '\040', '\061', - '\012', '\126', '\150', '\165', '\040', '\164', '\150', '\040', '\061', - '\012', '\102', '\172', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\112', '\166', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\126', '\152', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\124', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\104', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\131', '\163', '\166', '\040', '\163', '\164', '\040', '\061', - '\012', '\172', '\164', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\164', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\106', '\171', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\161', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\163', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\152', '\123', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\130', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\160', '\113', '\040', '\160', '\162', '\040', '\061', - '\012', '\156', '\104', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\113', '\170', '\040', '\163', '\164', '\040', '\061', - '\012', '\170', '\131', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\132', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\160', '\170', '\146', '\040', '\160', '\162', '\040', '\061', - '\012', '\152', '\161', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\124', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\116', '\153', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\160', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\105', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\161', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\110', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\104', '\153', '\160', '\040', '\153', '\141', '\040', '\061', - '\012', '\143', '\161', '\131', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\161', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\126', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\120', '\170', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\170', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\124', '\146', '\040', '\156', '\171', '\040', '\061', - '\012', '\167', '\103', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\121', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\146', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\171', '\121', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\147', '\125', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\163', '\121', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\107', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\167', '\113', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\167', '\167', '\102', '\040', '\167', '\141', '\040', '\061', - '\012', '\166', '\106', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\167', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\162', '\102', '\040', '\141', '\156', '\040', '\061', - '\012', '\154', '\160', '\131', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\154', '\122', '\040', '\154', '\145', '\040', '\061', - '\012', '\146', '\144', '\113', '\040', '\144', '\145', '\040', '\061', - '\012', '\145', '\106', '\172', '\040', '\145', '\162', '\040', '\061', - '\012', '\152', '\171', '\121', '\040', '\151', '\152', '\040', '\061', - '\012', '\154', '\167', '\124', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\103', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\143', '\147', '\115', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\164', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\141', '\161', '\112', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\130', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\144', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\170', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\143', '\123', '\040', '\143', '\150', '\040', '\061', - '\012', '\156', '\155', '\126', '\040', '\141', '\156', '\040', '\061', - '\012', '\162', '\121', '\144', '\040', '\145', '\162', '\040', '\061', - '\012', '\107', '\154', '\153', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\105', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\166', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\166', '\106', '\040', '\163', '\164', '\040', '\061', - '\012', '\163', '\112', '\170', '\040', '\163', '\164', '\040', '\061', - '\012', '\121', '\171', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\130', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\164', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\107', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\132', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\105', '\166', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\172', '\104', '\040', '\163', '\172', '\040', '\061', - '\012', '\165', '\146', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\120', '\170', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\144', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\113', '\172', '\040', '\145', '\162', '\040', '\061', - '\012', '\112', '\150', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\103', '\170', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\170', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\124', '\154', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\107', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\131', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\105', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\172', '\125', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\127', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\127', '\142', '\040', '\145', '\162', '\040', '\061', - '\012', '\127', '\162', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\163', '\114', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\112', '\160', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\153', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\166', '\147', '\105', '\040', '\156', '\147', '\040', '\061', - '\012', '\102', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\121', '\163', '\040', '\157', '\156', '\040', '\061', - '\012', '\153', '\142', '\132', '\040', '\153', '\141', '\040', '\061', - '\012', '\162', '\126', '\146', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\114', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\162', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\163', '\122', '\040', '\163', '\164', '\040', '\061', - '\012', '\150', '\167', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\156', '\153', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\120', '\172', '\040', '\143', '\150', '\040', '\061', - '\012', '\125', '\143', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\145', '\147', '\112', '\040', '\156', '\147', '\040', '\061', - '\012', '\121', '\171', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\167', '\162', '\040', '\160', '\162', '\040', '\061', - '\012', '\170', '\146', '\104', '\040', '\146', '\157', '\040', '\061', - '\012', '\167', '\171', '\110', '\040', '\167', '\141', '\040', '\061', - '\012', '\154', '\102', '\167', '\040', '\154', '\145', '\040', '\061', - '\012', '\115', '\144', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\121', '\163', '\171', '\040', '\163', '\164', '\040', '\061', - '\012', '\172', '\161', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\160', '\131', '\040', '\166', '\141', '\040', '\061', - '\012', '\163', '\154', '\131', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\147', '\114', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\156', '\116', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\126', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\113', '\170', '\040', '\156', '\171', '\040', '\061', - '\012', '\142', '\144', '\127', '\040', '\144', '\145', '\040', '\061', - '\012', '\154', '\161', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\150', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\116', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\112', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\111', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\110', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\171', '\162', '\112', '\040', '\145', '\162', '\040', '\061', - '\012', '\154', '\162', '\122', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\172', '\131', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\147', '\102', '\040', '\160', '\162', '\040', '\061', - '\012', '\155', '\146', '\103', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\153', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\125', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\103', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\154', '\116', '\040', '\154', '\145', '\040', '\061', - '\012', '\102', '\147', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\143', '\105', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\122', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\150', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\145', '\107', '\172', '\040', '\145', '\162', '\040', '\061', - '\012', '\106', '\160', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\166', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\155', '\102', '\146', '\040', '\155', '\145', '\040', '\061', - '\012', '\150', '\150', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\157', '\125', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\170', '\121', '\040', '\144', '\145', '\040', '\061', - '\012', '\127', '\150', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\115', '\153', '\040', '\145', '\162', '\040', '\061', - '\012', '\154', '\127', '\144', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\127', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\157', '\121', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\127', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\156', '\165', '\126', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\127', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\166', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\167', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\155', '\112', '\040', '\163', '\164', '\040', '\061', - '\012', '\110', '\154', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\112', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\155', '\131', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\132', '\156', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\152', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\112', '\150', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\161', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\143', '\117', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\161', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\102', '\146', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\153', '\126', '\040', '\153', '\141', '\040', '\061', - '\012', '\164', '\102', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\153', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\113', '\161', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\127', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\130', '\171', '\040', '\154', '\145', '\040', '\061', - '\012', '\171', '\122', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\155', '\152', '\110', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\172', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\170', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\166', '\155', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\143', '\115', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\113', '\166', '\040', '\153', '\141', '\040', '\061', - '\012', '\171', '\157', '\130', '\040', '\160', '\157', '\040', '\061', - '\012', '\170', '\162', '\124', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\127', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\161', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\127', '\152', '\040', '\163', '\164', '\040', '\061', - '\012', '\123', '\144', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\146', '\122', '\040', '\144', '\145', '\040', '\061', - '\012', '\113', '\161', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\107', '\152', '\144', '\040', '\144', '\157', '\040', '\061', - '\012', '\121', '\142', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\171', '\113', '\040', '\156', '\171', '\040', '\061', - '\012', '\170', '\155', '\130', '\040', '\155', '\145', '\040', '\061', - '\012', '\170', '\165', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\126', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\157', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\154', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\115', '\153', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\114', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\147', '\115', '\162', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\103', '\160', '\040', '\163', '\164', '\040', '\061', - '\012', '\142', '\107', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\130', '\157', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\124', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\153', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\124', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\116', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\130', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\143', '\132', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\126', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\111', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\161', '\156', '\110', '\040', '\141', '\156', '\040', '\061', - '\012', '\156', '\167', '\103', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\123', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\157', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\104', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\144', '\125', '\040', '\144', '\145', '\040', '\061', - '\012', '\130', '\155', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\153', '\116', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\131', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\131', '\147', '\160', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\154', '\112', '\040', '\154', '\145', '\040', '\061', - '\012', '\155', '\106', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\123', '\170', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\106', '\172', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\124', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\111', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\141', '\152', '\131', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\131', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\162', '\113', '\142', '\040', '\145', '\162', '\040', '\061', - '\012', '\160', '\172', '\102', '\040', '\163', '\172', '\040', '\061', - '\012', '\145', '\111', '\171', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\146', '\113', '\040', '\167', '\141', '\040', '\061', - '\012', '\106', '\155', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\146', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\154', '\155', '\040', '\154', '\145', '\040', '\061', - '\012', '\103', '\172', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\154', '\120', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\161', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\106', '\171', '\040', '\167', '\141', '\040', '\061', - '\012', '\142', '\121', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\126', '\167', '\040', '\153', '\141', '\040', '\061', - '\012', '\156', '\115', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\103', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\157', '\145', '\105', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\110', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\146', '\116', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\155', '\130', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\116', '\153', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\127', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\106', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\113', '\146', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\142', '\147', '\131', '\040', '\156', '\147', '\040', '\061', - '\012', '\154', '\131', '\172', '\040', '\154', '\145', '\040', '\061', - '\012', '\143', '\147', '\104', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\147', '\115', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\150', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\162', '\104', '\040', '\145', '\162', '\040', '\061', - '\012', '\152', '\167', '\101', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\171', '\115', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\172', '\103', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\121', '\144', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\143', '\110', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\142', '\130', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\172', '\107', '\040', '\163', '\172', '\040', '\061', - '\012', '\155', '\123', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\131', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\161', '\147', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\131', '\153', '\040', '\151', '\152', '\040', '\061', - '\012', '\144', '\111', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\160', '\107', '\040', '\160', '\162', '\040', '\061', - '\012', '\150', '\126', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\124', '\152', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\166', '\120', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\132', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\106', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\146', '\125', '\040', '\153', '\141', '\040', '\061', - '\012', '\123', '\170', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\167', '\106', '\040', '\167', '\141', '\040', '\061', - '\012', '\121', '\167', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\127', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\152', '\161', '\121', '\040', '\151', '\152', '\040', '\061', - '\012', '\126', '\146', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\143', '\112', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\167', '\112', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\102', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\104', '\144', '\155', '\040', '\144', '\145', '\040', '\061', - '\012', '\142', '\127', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\160', '\107', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\162', '\121', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\143', '\123', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\110', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\111', '\171', '\040', '\164', '\150', '\040', '\061', - '\012', '\131', '\170', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\163', '\144', '\103', '\040', '\163', '\164', '\040', '\061', - '\012', '\171', '\126', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\152', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\124', '\172', '\171', '\040', '\163', '\172', '\040', '\061', - '\012', '\106', '\146', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\172', '\130', '\040', '\163', '\172', '\040', '\061', - '\012', '\110', '\144', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\147', '\114', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\131', '\161', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\114', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\154', '\121', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\152', '\107', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\160', '\114', '\040', '\160', '\162', '\040', '\061', - '\012', '\143', '\112', '\162', '\040', '\143', '\150', '\040', '\061', - '\012', '\141', '\112', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\131', '\156', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\127', '\166', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\113', '\171', '\040', '\154', '\145', '\040', '\061', - '\012', '\145', '\131', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\170', '\114', '\040', '\153', '\141', '\040', '\061', - '\012', '\147', '\103', '\142', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\122', '\144', '\040', '\163', '\164', '\040', '\061', - '\012', '\162', '\115', '\144', '\040', '\145', '\162', '\040', '\061', - '\012', '\102', '\166', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\113', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\154', '\113', '\040', '\154', '\145', '\040', '\061', - '\012', '\155', '\104', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\153', '\112', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\122', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\154', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\122', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\166', '\116', '\040', '\166', '\141', '\040', '\061', - '\012', '\156', '\170', '\111', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\103', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\131', '\142', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\105', '\142', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\153', '\116', '\040', '\153', '\141', '\040', '\061', - '\012', '\142', '\121', '\171', '\040', '\142', '\145', '\040', '\061', - '\012', '\162', '\104', '\167', '\040', '\145', '\162', '\040', '\061', - '\012', '\144', '\152', '\112', '\040', '\144', '\145', '\040', '\061', - '\012', '\164', '\155', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\167', '\110', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\112', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\143', '\115', '\040', '\143', '\150', '\040', '\061', - '\012', '\157', '\172', '\126', '\040', '\157', '\156', '\040', '\061', - '\012', '\155', '\114', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\142', '\113', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\145', '\132', '\146', '\040', '\145', '\162', '\040', '\061', - '\012', '\106', '\150', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\143', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\114', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\161', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\130', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\164', '\147', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\121', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\104', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\157', '\104', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\147', '\115', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\156', '\104', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\110', '\160', '\040', '\156', '\147', '\040', '\061', - '\012', '\127', '\153', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\111', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\114', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\164', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\144', '\121', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\103', '\155', '\040', '\157', '\167', '\040', '\061', - '\012', '\166', '\126', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\112', '\155', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\150', '\142', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\162', '\127', '\040', '\145', '\162', '\040', '\061', - '\012', '\156', '\170', '\116', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\126', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\165', '\127', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\147', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\102', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\125', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\146', '\154', '\110', '\040', '\154', '\145', '\040', '\061', - '\012', '\171', '\127', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\152', '\116', '\040', '\151', '\152', '\040', '\061', - '\012', '\125', '\167', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\156', '\131', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\164', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\120', '\147', '\160', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\106', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\157', '\130', '\172', '\040', '\157', '\156', '\040', '\061', - '\012', '\151', '\103', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\114', '\160', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\107', '\161', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\131', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\161', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\150', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\155', '\106', '\040', '\163', '\172', '\040', '\061', - '\012', '\102', '\160', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\112', '\146', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\130', '\166', '\040', '\157', '\156', '\040', '\061', - '\012', '\154', '\147', '\130', '\040', '\156', '\147', '\040', '\061', - '\012', '\112', '\146', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\172', '\160', '\123', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\143', '\117', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\167', '\121', '\040', '\167', '\141', '\040', '\061', - '\012', '\160', '\153', '\121', '\040', '\153', '\141', '\040', '\061', - '\012', '\167', '\117', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\127', '\147', '\155', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\117', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\116', '\146', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\161', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\163', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\144', '\110', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\122', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\153', '\130', '\040', '\153', '\141', '\040', '\061', - '\012', '\143', '\104', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\146', '\125', '\040', '\155', '\145', '\040', '\061', - '\012', '\170', '\172', '\115', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\107', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\165', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\161', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\124', '\161', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\166', '\104', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\127', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\106', '\172', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\161', '\160', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\171', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\121', '\145', '\040', '\156', '\147', '\040', '\061', - '\012', '\132', '\155', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\131', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\166', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\141', '\121', '\154', '\040', '\141', '\156', '\040', '\061', - '\012', '\157', '\161', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\145', '\161', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\166', '\124', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\125', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\151', '\142', '\110', '\040', '\151', '\156', '\040', '\061', - '\012', '\152', '\166', '\132', '\040', '\151', '\152', '\040', '\061', - '\012', '\127', '\167', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\147', '\131', '\040', '\156', '\147', '\040', '\061', - '\012', '\145', '\106', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\130', '\147', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\131', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\153', '\132', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\166', '\160', '\104', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\143', '\132', '\040', '\143', '\150', '\040', '\061', - '\012', '\102', '\161', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\114', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\162', '\167', '\130', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\171', '\113', '\040', '\156', '\171', '\040', '\061', - '\012', '\123', '\170', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\163', '\170', '\132', '\040', '\163', '\164', '\040', '\061', - '\012', '\167', '\153', '\113', '\040', '\153', '\141', '\040', '\061', - '\012', '\171', '\112', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\164', '\152', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\120', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\132', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\122', '\162', '\155', '\040', '\145', '\162', '\040', '\061', - '\012', '\156', '\150', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\161', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\170', '\131', '\040', '\156', '\171', '\040', '\061', - '\012', '\166', '\163', '\105', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\153', '\113', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\165', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\121', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\130', '\166', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\155', '\115', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\117', '\161', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\104', '\170', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\114', '\161', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\127', '\156', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\155', '\107', '\040', '\151', '\152', '\040', '\061', - '\012', '\127', '\161', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\150', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\147', '\132', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\155', '\117', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\106', '\155', '\040', '\163', '\172', '\040', '\061', - '\012', '\113', '\150', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\161', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\126', '\166', '\040', '\141', '\156', '\040', '\061', - '\012', '\122', '\146', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\155', '\114', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\144', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\127', '\160', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\166', '\117', '\040', '\166', '\141', '\040', '\061', - '\012', '\144', '\131', '\160', '\040', '\144', '\145', '\040', '\061', - '\012', '\157', '\150', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\157', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\152', '\102', '\040', '\145', '\162', '\040', '\061', - '\012', '\104', '\167', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\141', '\127', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\154', '\104', '\040', '\143', '\150', '\040', '\061', - '\012', '\126', '\144', '\153', '\040', '\144', '\145', '\040', '\061', - '\012', '\164', '\167', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\132', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\121', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\144', '\167', '\104', '\040', '\144', '\145', '\040', '\061', - '\012', '\151', '\131', '\166', '\040', '\151', '\156', '\040', '\061', - '\012', '\101', '\167', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\147', '\107', '\040', '\156', '\147', '\040', '\061', - '\012', '\130', '\157', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\162', '\121', '\040', '\145', '\162', '\040', '\061', - '\012', '\126', '\170', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\154', '\167', '\102', '\040', '\154', '\145', '\040', '\061', - '\012', '\120', '\170', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\112', '\167', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\172', '\114', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\164', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\167', '\131', '\040', '\160', '\162', '\040', '\061', - '\012', '\115', '\152', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\130', '\162', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\130', '\165', '\040', '\165', '\156', '\040', '\061', - '\012', '\105', '\161', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\102', '\160', '\171', '\040', '\160', '\162', '\040', '\061', - '\012', '\172', '\156', '\131', '\040', '\141', '\156', '\040', '\061', - '\012', '\122', '\161', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\121', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\132', '\166', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\152', '\117', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\116', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\154', '\111', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\115', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\161', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\115', '\146', '\040', '\154', '\145', '\040', '\061', - '\012', '\112', '\161', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\126', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\166', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\145', '\110', '\153', '\040', '\145', '\162', '\040', '\061', - '\012', '\152', '\142', '\113', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\127', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\124', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\156', '\106', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\170', '\117', '\040', '\156', '\171', '\040', '\061', - '\012', '\106', '\161', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\106', '\142', '\040', '\141', '\156', '\040', '\061', - '\012', '\157', '\104', '\160', '\040', '\157', '\156', '\040', '\061', - '\012', '\152', '\125', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\110', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\107', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\120', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\110', '\166', '\040', '\151', '\152', '\040', '\061', - '\012', '\111', '\167', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\172', '\126', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\125', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\121', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\106', '\142', '\040', '\163', '\164', '\040', '\061', - '\012', '\114', '\166', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\124', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\166', '\113', '\040', '\166', '\141', '\040', '\061', - '\012', '\103', '\143', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\171', '\101', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\105', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\144', '\107', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\161', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\142', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\110', '\144', '\040', '\141', '\156', '\040', '\061', - '\012', '\110', '\150', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\126', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\165', '\110', '\167', '\040', '\165', '\156', '\040', '\061', - '\012', '\132', '\143', '\153', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\120', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\170', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\110', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\104', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\164', '\154', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\114', '\163', '\166', '\040', '\163', '\164', '\040', '\061', - '\012', '\172', '\166', '\106', '\040', '\166', '\141', '\040', '\061', - '\012', '\155', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\161', '\106', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\147', '\115', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\171', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\162', '\112', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\123', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\115', '\155', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\103', '\147', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\122', '\154', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\155', '\166', '\107', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\165', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\126', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\115', '\172', '\040', '\163', '\164', '\040', '\061', - '\012', '\167', '\127', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\160', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\121', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\102', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\143', '\127', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\170', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\146', '\113', '\040', '\145', '\162', '\040', '\061', - '\012', '\155', '\106', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\121', '\156', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\152', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\122', '\153', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\163', '\162', '\105', '\040', '\145', '\162', '\040', '\061', - '\012', '\144', '\162', '\107', '\040', '\145', '\162', '\040', '\061', - '\012', '\103', '\146', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\171', '\132', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\127', '\170', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\172', '\103', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\132', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\116', '\161', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\147', '\117', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\127', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\162', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\116', '\172', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\110', '\152', '\171', '\040', '\151', '\152', '\040', '\061', - '\012', '\125', '\170', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\157', '\111', '\171', '\040', '\157', '\156', '\040', '\061', - '\012', '\162', '\146', '\130', '\040', '\145', '\162', '\040', '\061', - '\012', '\157', '\102', '\167', '\040', '\157', '\156', '\040', '\061', - '\012', '\171', '\171', '\126', '\040', '\156', '\171', '\040', '\061', - '\012', '\121', '\151', '\166', '\040', '\151', '\156', '\040', '\061', - '\012', '\144', '\113', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\104', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\147', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\116', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\144', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\166', '\131', '\040', '\157', '\156', '\040', '\061', - '\012', '\146', '\142', '\132', '\040', '\142', '\145', '\040', '\061', - '\012', '\161', '\151', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\166', '\124', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\131', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\142', '\113', '\040', '\153', '\141', '\040', '\061', - '\012', '\115', '\146', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\122', '\160', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\160', '\110', '\142', '\040', '\160', '\162', '\040', '\061', - '\012', '\161', '\161', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\153', '\126', '\040', '\153', '\141', '\040', '\061', - '\012', '\163', '\127', '\160', '\040', '\163', '\164', '\040', '\061', - '\012', '\153', '\120', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\114', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\157', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\114', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\150', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\160', '\114', '\040', '\160', '\162', '\040', '\061', - '\012', '\124', '\161', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\172', '\107', '\040', '\163', '\172', '\040', '\061', - '\012', '\153', '\143', '\124', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\152', '\130', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\120', '\171', '\040', '\153', '\165', '\040', '\061', - '\012', '\146', '\144', '\102', '\040', '\144', '\145', '\040', '\061', - '\012', '\121', '\170', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\147', '\131', '\146', '\040', '\156', '\147', '\040', '\061', - '\012', '\131', '\160', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\172', '\123', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\104', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\142', '\112', '\040', '\142', '\145', '\040', '\061', - '\012', '\171', '\146', '\117', '\040', '\156', '\171', '\040', '\061', - '\012', '\165', '\121', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\160', '\121', '\040', '\160', '\162', '\040', '\061', - '\012', '\144', '\130', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\167', '\120', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\124', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\112', '\154', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\103', '\161', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\127', '\171', '\040', '\142', '\145', '\040', '\061', - '\012', '\143', '\125', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\131', '\142', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\167', '\171', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\150', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\125', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\116', '\143', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\115', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\132', '\171', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\143', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\121', '\163', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\114', '\150', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\107', '\143', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\121', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\131', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\131', '\155', '\040', '\144', '\145', '\040', '\061', - '\012', '\121', '\166', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\122', '\143', '\147', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\107', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\170', '\112', '\040', '\142', '\145', '\040', '\061', - '\012', '\152', '\106', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\114', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\154', '\104', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\161', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\111', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\102', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\121', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\172', '\112', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\146', '\112', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\124', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\142', '\130', '\040', '\153', '\141', '\040', '\061', - '\012', '\110', '\154', '\172', '\040', '\154', '\145', '\040', '\061', - '\012', '\160', '\165', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\113', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\102', '\142', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\160', '\127', '\040', '\166', '\141', '\040', '\061', - '\012', '\131', '\152', '\153', '\040', '\151', '\152', '\040', '\061', - '\012', '\127', '\156', '\155', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\132', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\154', '\144', '\132', '\040', '\154', '\145', '\040', '\061', - '\012', '\147', '\115', '\155', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\132', '\146', '\040', '\160', '\151', '\040', '\061', - '\012', '\145', '\131', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\124', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\107', '\153', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\103', '\147', '\171', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\104', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\170', '\127', '\040', '\156', '\147', '\040', '\061', - '\012', '\103', '\167', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\150', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\166', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\156', '\146', '\110', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\143', '\127', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\147', '\103', '\040', '\156', '\147', '\040', '\061', - '\012', '\104', '\146', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\166', '\160', '\112', '\040', '\166', '\141', '\040', '\061', - '\012', '\127', '\160', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\163', '\103', '\142', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\147', '\106', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\120', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\157', '\103', '\160', '\040', '\157', '\156', '\040', '\061', - '\012', '\116', '\162', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\110', '\167', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\146', '\122', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\141', '\145', '\130', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\144', '\111', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\102', '\166', '\040', '\163', '\164', '\040', '\061', - '\012', '\166', '\117', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\121', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\155', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\120', '\161', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\150', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\153', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\150', '\142', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\172', '\106', '\040', '\163', '\172', '\040', '\061', - '\012', '\131', '\142', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\163', '\130', '\142', '\040', '\163', '\164', '\040', '\061', - '\012', '\171', '\121', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\150', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\147', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\130', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\116', '\170', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\141', '\117', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\146', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\121', '\170', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\161', '\167', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\152', '\126', '\040', '\151', '\152', '\040', '\061', - '\012', '\150', '\152', '\131', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\164', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\147', '\125', '\040', '\156', '\147', '\040', '\061', - '\012', '\156', '\115', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\116', '\167', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\166', '\120', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\130', '\146', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\106', '\146', '\040', '\156', '\171', '\040', '\061', - '\012', '\146', '\110', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\156', '\132', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\120', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\147', '\142', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\102', '\142', '\040', '\142', '\151', '\040', '\061', - '\012', '\163', '\152', '\117', '\040', '\163', '\164', '\040', '\061', - '\012', '\167', '\104', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\156', '\152', '\116', '\040', '\141', '\156', '\040', '\061', - '\012', '\157', '\150', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\161', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\106', '\172', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\162', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\152', '\107', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\106', '\166', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\121', '\144', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\142', '\105', '\040', '\166', '\151', '\040', '\061', - '\012', '\125', '\152', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\111', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\106', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\166', '\131', '\040', '\166', '\141', '\040', '\061', - '\012', '\123', '\172', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\154', '\110', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\143', '\131', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\105', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\150', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\126', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\146', '\110', '\040', '\142', '\145', '\040', '\061', - '\012', '\116', '\162', '\172', '\040', '\145', '\162', '\040', '\061', - '\012', '\163', '\112', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\127', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\156', '\166', '\113', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\151', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\142', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\170', '\102', '\040', '\166', '\141', '\040', '\061', - '\012', '\164', '\166', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\116', '\162', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\131', '\170', '\040', '\154', '\145', '\040', '\061', - '\012', '\164', '\153', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\107', '\172', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\103', '\170', '\040', '\166', '\151', '\040', '\061', - '\012', '\132', '\142', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\127', '\160', '\040', '\155', '\145', '\040', '\061', - '\012', '\104', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\146', '\105', '\040', '\160', '\162', '\040', '\061', - '\012', '\150', '\166', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\105', '\157', '\170', '\040', '\157', '\156', '\040', '\061', - '\012', '\144', '\142', '\132', '\040', '\144', '\145', '\040', '\061', - '\012', '\154', '\116', '\142', '\040', '\154', '\145', '\040', '\061', - '\012', '\162', '\124', '\144', '\040', '\145', '\162', '\040', '\061', - '\012', '\154', '\152', '\121', '\040', '\154', '\145', '\040', '\061', - '\012', '\126', '\166', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\112', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\165', '\161', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\152', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\104', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\147', '\121', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\153', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\112', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\144', '\111', '\040', '\144', '\145', '\040', '\061', - '\012', '\107', '\143', '\160', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\130', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\121', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\147', '\105', '\040', '\156', '\147', '\040', '\061', - '\012', '\113', '\172', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\120', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\110', '\143', '\172', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\152', '\121', '\040', '\144', '\145', '\040', '\061', - '\012', '\160', '\107', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\171', '\105', '\040', '\156', '\171', '\040', '\061', - '\012', '\144', '\102', '\142', '\040', '\144', '\145', '\040', '\061', - '\012', '\145', '\120', '\152', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\147', '\117', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\122', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\161', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\113', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\170', '\155', '\131', '\040', '\155', '\145', '\040', '\061', - '\012', '\150', '\147', '\117', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\144', '\107', '\040', '\144', '\145', '\040', '\061', - '\012', '\150', '\166', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\162', '\106', '\040', '\145', '\162', '\040', '\061', - '\012', '\102', '\166', '\146', '\040', '\166', '\151', '\040', '\061', - '\012', '\171', '\166', '\104', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\126', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\131', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\161', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\145', '\106', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\167', '\132', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\161', '\107', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\113', '\160', '\040', '\163', '\164', '\040', '\061', - '\012', '\150', '\112', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\114', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\150', '\144', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\143', '\116', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\116', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\154', '\113', '\040', '\154', '\145', '\040', '\061', - '\012', '\162', '\112', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\141', '\116', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\113', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\163', '\116', '\146', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\120', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\172', '\114', '\040', '\163', '\172', '\040', '\061', - '\012', '\112', '\144', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\156', '\122', '\142', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\116', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\164', '\156', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\156', '\111', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\132', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\132', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\167', '\115', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\117', '\156', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\111', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\166', '\110', '\040', '\166', '\141', '\040', '\061', - '\012', '\125', '\166', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\170', '\112', '\040', '\163', '\172', '\040', '\061', - '\012', '\126', '\155', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\120', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\167', '\104', '\040', '\155', '\145', '\040', '\061', - '\012', '\152', '\121', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\120', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\146', '\126', '\040', '\166', '\141', '\040', '\061', - '\012', '\124', '\161', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\112', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\154', '\167', '\117', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\142', '\107', '\040', '\167', '\141', '\040', '\061', - '\012', '\146', '\124', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\130', '\164', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\172', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\120', '\172', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\120', '\155', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\170', '\132', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\152', '\103', '\160', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\113', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\124', '\155', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\110', '\156', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\152', '\130', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\147', '\110', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\123', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\171', '\154', '\116', '\040', '\154', '\145', '\040', '\061', - '\012', '\147', '\166', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\124', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\127', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\167', '\102', '\040', '\167', '\141', '\040', '\061', - '\012', '\142', '\103', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\116', '\153', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\103', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\170', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\156', '\124', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\106', '\163', '\040', '\156', '\147', '\040', '\061', - '\012', '\130', '\167', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\112', '\154', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\143', '\122', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\142', '\124', '\040', '\142', '\145', '\040', '\061', - '\012', '\106', '\143', '\144', '\040', '\143', '\150', '\040', '\061', - '\012', '\127', '\170', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\167', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\123', '\146', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\143', '\113', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\142', '\126', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\123', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\154', '\142', '\102', '\040', '\154', '\145', '\040', '\061', - '\012', '\117', '\143', '\167', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\147', '\115', '\040', '\156', '\147', '\040', '\061', - '\012', '\156', '\142', '\111', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\163', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\171', '\146', '\040', '\156', '\171', '\040', '\061', - '\012', '\160', '\170', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\155', '\122', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\117', '\147', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\165', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\130', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\142', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\124', '\142', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\172', '\162', '\122', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\155', '\120', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\103', '\155', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\164', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\150', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\152', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\147', '\107', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\106', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\162', '\161', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\123', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\142', '\113', '\040', '\142', '\145', '\040', '\061', - '\012', '\155', '\161', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\162', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\144', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\143', '\107', '\040', '\143', '\150', '\040', '\061', - '\012', '\151', '\106', '\142', '\040', '\151', '\156', '\040', '\061', - '\012', '\155', '\143', '\132', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\103', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\110', '\172', '\040', '\164', '\172', '\040', '\061', - '\012', '\150', '\152', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\164', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\155', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\154', '\104', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\122', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\103', '\144', '\040', '\156', '\147', '\040', '\061', - '\012', '\130', '\170', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\113', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\111', '\167', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\163', '\131', '\040', '\163', '\164', '\040', '\061', - '\012', '\170', '\162', '\112', '\040', '\145', '\162', '\040', '\061', - '\012', '\164', '\116', '\163', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\142', '\104', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\114', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\106', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\116', '\170', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\146', '\122', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\112', '\162', '\142', '\040', '\145', '\162', '\040', '\061', - '\012', '\152', '\105', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\167', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\126', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\147', '\116', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\101', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\120', '\152', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\156', '\160', '\120', '\040', '\151', '\156', '\040', '\061', - '\012', '\112', '\143', '\171', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\112', '\142', '\040', '\142', '\151', '\040', '\061', - '\012', '\152', '\170', '\111', '\040', '\151', '\152', '\040', '\061', - '\012', '\113', '\153', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\167', '\126', '\040', '\153', '\141', '\040', '\061', - '\012', '\147', '\122', '\146', '\040', '\156', '\147', '\040', '\061', - '\012', '\127', '\146', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\124', '\144', '\160', '\040', '\160', '\157', '\040', '\061', - '\012', '\167', '\105', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\114', '\166', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\104', '\161', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\161', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\112', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\144', '\103', '\040', '\144', '\145', '\040', '\061', - '\012', '\150', '\170', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\125', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\164', '\121', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\114', '\172', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\124', '\152', '\040', '\144', '\145', '\040', '\061', - '\012', '\124', '\154', '\172', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\121', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\106', '\143', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\147', '\105', '\040', '\156', '\147', '\040', '\061', - '\012', '\103', '\153', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\113', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\170', '\167', '\123', '\040', '\167', '\141', '\040', '\061', - '\012', '\167', '\122', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\153', '\113', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\121', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\114', '\160', '\040', '\163', '\164', '\040', '\061', - '\012', '\152', '\101', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\144', '\155', '\107', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\113', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\125', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\130', '\171', '\040', '\167', '\141', '\040', '\061', - '\012', '\142', '\172', '\112', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\172', '\112', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\116', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\147', '\131', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\150', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\141', '\146', '\130', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\132', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\130', '\144', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\124', '\144', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\116', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\130', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\143', '\105', '\040', '\143', '\150', '\040', '\061', - '\012', '\115', '\156', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\104', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\124', '\144', '\152', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\147', '\112', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\144', '\122', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\107', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\115', '\152', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\163', '\170', '\110', '\040', '\163', '\164', '\040', '\061', - '\012', '\120', '\160', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\146', '\126', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\117', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\116', '\166', '\170', '\040', '\166', '\151', '\040', '\061', - '\012', '\161', '\141', '\126', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\152', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\147', '\132', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\107', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\132', '\170', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\115', '\146', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\172', '\106', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\147', '\112', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\160', '\107', '\040', '\160', '\162', '\040', '\061', - '\012', '\166', '\113', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\161', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\147', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\121', '\171', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\152', '\155', '\111', '\040', '\151', '\152', '\040', '\061', - '\012', '\126', '\147', '\144', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\103', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\126', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\165', '\105', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\143', '\116', '\040', '\143', '\150', '\040', '\061', - '\012', '\102', '\172', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\126', '\154', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\130', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\121', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\154', '\162', '\131', '\040', '\145', '\162', '\040', '\061', - '\012', '\126', '\164', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\110', '\163', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\152', '\116', '\040', '\151', '\152', '\040', '\061', - '\012', '\162', '\172', '\112', '\040', '\145', '\162', '\040', '\061', - '\012', '\163', '\131', '\171', '\040', '\163', '\164', '\040', '\061', - '\012', '\167', '\170', '\121', '\040', '\167', '\141', '\040', '\061', - '\012', '\132', '\164', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\127', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\103', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\141', '\106', '\142', '\040', '\141', '\156', '\040', '\061', - '\012', '\154', '\161', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\145', '\132', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\120', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\152', '\131', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\113', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\150', '\171', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\103', '\152', '\040', '\144', '\145', '\040', '\061', - '\012', '\142', '\153', '\110', '\040', '\153', '\141', '\040', '\061', - '\012', '\171', '\152', '\104', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\124', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\150', '\170', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\166', '\113', '\040', '\166', '\151', '\040', '\061', - '\012', '\114', '\167', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\163', '\167', '\121', '\040', '\163', '\164', '\040', '\061', - '\012', '\144', '\124', '\153', '\040', '\144', '\151', '\040', '\061', - '\012', '\146', '\163', '\117', '\040', '\163', '\164', '\040', '\061', - '\012', '\154', '\152', '\105', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\152', '\115', '\040', '\151', '\152', '\040', '\061', - '\012', '\165', '\121', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\120', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\155', '\103', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\163', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\104', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\112', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\132', '\160', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\150', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\116', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\127', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\106', '\167', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\110', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\106', '\156', '\166', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\144', '\114', '\040', '\144', '\145', '\040', '\061', - '\012', '\157', '\161', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\141', '\131', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\126', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\113', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\103', '\142', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\166', '\171', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\161', '\132', '\040', '\143', '\150', '\040', '\061', - '\012', '\122', '\146', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\123', '\167', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\116', '\151', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\157', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\150', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\112', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\144', '\106', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\166', '\106', '\040', '\166', '\141', '\040', '\061', - '\012', '\143', '\160', '\126', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\164', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\127', '\155', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\120', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\102', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\162', '\154', '\126', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\132', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\124', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\150', '\146', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\123', '\166', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\153', '\155', '\107', '\040', '\153', '\141', '\040', '\061', - '\012', '\163', '\104', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\107', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\102', '\154', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\162', '\171', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\110', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\114', '\170', '\040', '\156', '\171', '\040', '\061', - '\012', '\154', '\161', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\142', '\102', '\040', '\142', '\151', '\040', '\061', - '\012', '\151', '\131', '\162', '\040', '\151', '\156', '\040', '\061', - '\012', '\167', '\104', '\172', '\040', '\164', '\172', '\040', '\061', - '\012', '\170', '\163', '\112', '\040', '\163', '\164', '\040', '\061', - '\012', '\142', '\172', '\131', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\115', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\125', '\165', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\170', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\166', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\153', '\162', '\132', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\167', '\126', '\040', '\167', '\141', '\040', '\061', - '\012', '\147', '\120', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\126', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\121', '\156', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\104', '\142', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\126', '\162', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\113', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\170', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\157', '\132', '\152', '\040', '\157', '\156', '\040', '\061', - '\012', '\172', '\101', '\171', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\115', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\166', '\111', '\040', '\166', '\141', '\040', '\061', - '\012', '\106', '\167', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\172', '\161', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\145', '\126', '\166', '\040', '\145', '\162', '\040', '\061', - '\012', '\171', '\127', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\167', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\114', '\155', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\166', '\130', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\130', '\150', '\163', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\154', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\161', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\142', '\113', '\040', '\163', '\172', '\040', '\061', - '\012', '\120', '\170', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\156', '\120', '\155', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\121', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\104', '\143', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\152', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\152', '\112', '\040', '\145', '\162', '\040', '\061', - '\012', '\142', '\115', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\151', '\131', '\142', '\040', '\151', '\156', '\040', '\061', - '\012', '\106', '\161', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\125', '\157', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\166', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\114', '\167', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\112', '\160', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\125', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\112', '\170', '\040', '\154', '\145', '\040', '\061', - '\012', '\130', '\167', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\113', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\132', '\156', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\103', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\142', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\121', '\165', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\116', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\166', '\126', '\040', '\166', '\141', '\040', '\061', - '\012', '\121', '\161', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\110', '\144', '\146', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\123', '\170', '\040', '\156', '\171', '\040', '\061', - '\012', '\161', '\123', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\150', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\115', '\166', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\143', '\104', '\160', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\110', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\155', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\164', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\142', '\112', '\040', '\144', '\145', '\040', '\061', - '\012', '\106', '\146', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\166', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\161', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\130', '\144', '\040', '\156', '\147', '\040', '\061', - '\012', '\165', '\106', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\160', '\122', '\040', '\151', '\152', '\040', '\061', - '\012', '\130', '\143', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\124', '\142', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\121', '\167', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\120', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\115', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\151', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\143', '\102', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\106', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\131', '\155', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\114', '\144', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\170', '\126', '\040', '\154', '\145', '\040', '\061', - '\012', '\143', '\103', '\153', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\126', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\154', '\124', '\040', '\154', '\145', '\040', '\061', - '\012', '\153', '\150', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\126', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\152', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\103', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\167', '\126', '\040', '\167', '\141', '\040', '\061', - '\012', '\171', '\142', '\132', '\040', '\142', '\145', '\040', '\061', - '\012', '\166', '\107', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\102', '\166', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\132', '\161', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\167', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\114', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\153', '\130', '\040', '\153', '\141', '\040', '\061', - '\012', '\116', '\142', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\130', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\144', '\121', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\131', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\131', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\172', '\123', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\171', '\143', '\132', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\156', '\125', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\103', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\156', '\131', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\164', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\167', '\117', '\040', '\163', '\164', '\040', '\061', - '\012', '\150', '\130', '\165', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\102', '\167', '\040', '\155', '\142', '\040', '\061', - '\012', '\167', '\155', '\106', '\040', '\155', '\145', '\040', '\061', - '\012', '\170', '\112', '\170', '\040', '\170', '\145', '\040', '\061', - '\012', '\144', '\130', '\152', '\040', '\144', '\145', '\040', '\061', - '\012', '\145', '\161', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\102', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\130', '\142', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\143', '\121', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\153', '\123', '\040', '\153', '\141', '\040', '\061', - '\012', '\164', '\117', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\121', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\166', '\126', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\102', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\103', '\153', '\040', '\144', '\145', '\040', '\061', - '\012', '\143', '\113', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\126', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\132', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\102', '\166', '\155', '\040', '\166', '\141', '\040', '\061', - '\012', '\154', '\161', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\170', '\122', '\040', '\146', '\157', '\040', '\061', - '\012', '\166', '\155', '\106', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\156', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\102', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\120', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\116', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\106', '\153', '\160', '\040', '\153', '\141', '\040', '\061', - '\012', '\131', '\171', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\125', '\142', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\172', '\120', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\155', '\121', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\143', '\101', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\113', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\166', '\132', '\040', '\166', '\141', '\040', '\061', - '\012', '\143', '\142', '\116', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\131', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\120', '\155', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\167', '\106', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\150', '\122', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\160', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\161', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\150', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\166', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\153', '\103', '\040', '\153', '\141', '\040', '\061', - '\012', '\171', '\164', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\114', '\156', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\170', '\104', '\040', '\144', '\145', '\040', '\061', - '\012', '\142', '\115', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\170', '\166', '\125', '\040', '\166', '\141', '\040', '\061', - '\012', '\121', '\172', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\163', '\162', '\115', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\114', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\107', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\126', '\155', '\171', '\040', '\155', '\145', '\040', '\061', - '\012', '\150', '\143', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\113', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\112', '\170', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\142', '\154', '\127', '\040', '\154', '\145', '\040', '\061', - '\012', '\160', '\121', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\142', '\105', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\127', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\131', '\155', '\040', '\163', '\164', '\040', '\061', - '\012', '\156', '\113', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\164', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\124', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\145', '\160', '\130', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\103', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\142', '\106', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\122', '\172', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\161', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\150', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\166', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\155', '\126', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\111', '\167', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\160', '\150', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\116', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\146', '\122', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\166', '\131', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\143', '\101', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\107', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\103', '\161', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\102', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\115', '\155', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\126', '\170', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\130', '\150', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\145', '\161', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\103', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\166', '\125', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\170', '\121', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\115', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\161', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\142', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\103', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\157', '\124', '\146', '\040', '\157', '\156', '\040', '\061', - '\012', '\153', '\142', '\127', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\152', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\161', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\131', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\150', '\105', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\131', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\143', '\111', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\166', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\157', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\106', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\161', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\116', '\170', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\126', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\172', '\110', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\142', '\123', '\040', '\142', '\145', '\040', '\061', - '\012', '\110', '\167', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\115', '\170', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\153', '\114', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\155', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\142', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\146', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\122', '\153', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\166', '\147', '\126', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\102', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\130', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\142', '\162', '\121', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\166', '\117', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\104', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\121', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\146', '\106', '\040', '\167', '\141', '\040', '\061', - '\012', '\150', '\132', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\147', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\156', '\131', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\130', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\145', '\116', '\142', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\170', '\123', '\040', '\146', '\157', '\040', '\061', - '\012', '\163', '\116', '\153', '\040', '\163', '\164', '\040', '\061', - '\012', '\155', '\106', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\125', '\165', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\144', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\157', '\172', '\127', '\040', '\157', '\156', '\040', '\061', - '\012', '\130', '\172', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\112', '\146', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\106', '\164', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\172', '\122', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\132', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\157', '\110', '\172', '\040', '\157', '\156', '\040', '\061', - '\012', '\161', '\166', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\157', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\123', '\144', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\170', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\105', '\147', '\146', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\115', '\146', '\040', '\144', '\145', '\040', '\061', - '\012', '\122', '\150', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\122', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\165', '\152', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\122', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\152', '\101', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\104', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\155', '\132', '\040', '\163', '\164', '\040', '\061', - '\012', '\152', '\111', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\153', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\113', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\163', '\103', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\165', '\124', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\126', '\163', '\040', '\154', '\145', '\040', '\061', - '\012', '\165', '\121', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\146', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\166', '\113', '\155', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\121', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\125', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\165', '\124', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\102', '\156', '\166', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\144', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\170', '\131', '\040', '\144', '\145', '\040', '\061', - '\012', '\150', '\147', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\144', '\146', '\040', '\144', '\145', '\040', '\061', - '\012', '\150', '\161', '\123', '\040', '\164', '\150', '\040', '\061', - '\012', '\145', '\112', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\107', '\165', '\040', '\165', '\156', '\040', '\061', - '\012', '\166', '\155', '\105', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\113', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\125', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\126', '\152', '\171', '\040', '\151', '\152', '\040', '\061', - '\012', '\165', '\166', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\110', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\115', '\150', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\163', '\132', '\040', '\163', '\164', '\040', '\061', - '\012', '\126', '\172', '\171', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\113', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\120', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\147', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\150', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\117', '\147', '\160', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\167', '\130', '\040', '\151', '\152', '\040', '\061', - '\012', '\154', '\131', '\171', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\172', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\130', '\152', '\040', '\152', '\157', '\040', '\061', - '\012', '\113', '\160', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\171', '\144', '\131', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\102', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\160', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\142', '\104', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\106', '\152', '\153', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\144', '\101', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\127', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\123', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\153', '\106', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\123', '\170', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\106', '\166', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\142', '\122', '\040', '\160', '\162', '\040', '\061', - '\012', '\161', '\162', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\132', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\166', '\125', '\155', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\105', '\171', '\040', '\167', '\141', '\040', '\061', - '\012', '\152', '\152', '\110', '\040', '\152', '\157', '\040', '\061', - '\012', '\163', '\104', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\125', '\152', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\156', '\111', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\117', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\103', '\152', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\142', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\161', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\145', '\120', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\122', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\160', '\166', '\107', '\040', '\166', '\141', '\040', '\061', - '\012', '\121', '\171', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\143', '\167', '\107', '\040', '\143', '\150', '\040', '\061', - '\012', '\104', '\164', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\120', '\142', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\122', '\147', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\152', '\125', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\112', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\122', '\170', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\164', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\166', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\113', '\155', '\040', '\153', '\141', '\040', '\061', - '\012', '\150', '\106', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\143', '\130', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\116', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\142', '\160', '\102', '\040', '\160', '\162', '\040', '\061', - '\012', '\170', '\161', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\131', '\171', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\107', '\160', '\040', '\156', '\147', '\040', '\061', - '\012', '\126', '\146', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\167', '\104', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\124', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\150', '\146', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\172', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\125', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\107', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\126', '\144', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\130', '\152', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\115', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\150', '\124', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\154', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\113', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\166', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\115', '\172', '\040', '\154', '\145', '\040', '\061', - '\012', '\115', '\167', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\127', '\154', '\166', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\172', '\107', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\155', '\104', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\117', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\142', '\142', '\111', '\040', '\142', '\145', '\040', '\061', - '\012', '\142', '\160', '\111', '\040', '\160', '\162', '\040', '\061', - '\012', '\146', '\121', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\121', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\105', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\106', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\127', '\150', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\166', '\121', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\131', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\170', '\115', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\120', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\152', '\104', '\040', '\151', '\152', '\040', '\061', - '\012', '\126', '\167', '\171', '\040', '\167', '\141', '\040', '\061', - '\012', '\131', '\161', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\143', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\131', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\112', '\142', '\040', '\156', '\147', '\040', '\061', - '\012', '\124', '\153', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\150', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\170', '\106', '\040', '\151', '\152', '\040', '\061', - '\012', '\106', '\160', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\153', '\130', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\147', '\132', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\156', '\111', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\171', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\102', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\123', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\161', '\111', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\131', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\162', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\163', '\110', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\162', '\113', '\040', '\145', '\162', '\040', '\061', - '\012', '\160', '\142', '\110', '\040', '\160', '\162', '\040', '\061', - '\012', '\172', '\126', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\121', '\142', '\040', '\144', '\145', '\040', '\061', - '\012', '\154', '\170', '\106', '\040', '\154', '\145', '\040', '\061', - '\012', '\163', '\147', '\127', '\040', '\156', '\147', '\040', '\061', - '\012', '\107', '\150', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\160', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\150', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\163', '\146', '\040', '\163', '\164', '\040', '\061', - '\012', '\121', '\147', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\122', '\144', '\160', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\166', '\113', '\040', '\166', '\141', '\040', '\061', - '\012', '\131', '\144', '\172', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\166', '\127', '\040', '\166', '\141', '\040', '\061', - '\012', '\143', '\120', '\155', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\121', '\171', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\167', '\106', '\040', '\167', '\141', '\040', '\061', - '\012', '\131', '\160', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\163', '\152', '\040', '\163', '\164', '\040', '\061', - '\012', '\131', '\147', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\126', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\171', '\170', '\114', '\040', '\156', '\171', '\040', '\061', - '\012', '\131', '\167', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\115', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\124', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\141', '\111', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\121', '\151', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\161', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\166', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\121', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\150', '\146', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\124', '\144', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\146', '\121', '\040', '\142', '\145', '\040', '\061', - '\012', '\113', '\146', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\143', '\130', '\163', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\131', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\121', '\157', '\143', '\040', '\162', '\157', '\040', '\061', - '\012', '\166', '\162', '\114', '\040', '\145', '\162', '\040', '\061', - '\012', '\160', '\132', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\143', '\144', '\130', '\040', '\143', '\150', '\040', '\061', - '\012', '\131', '\147', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\154', '\156', '\117', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\146', '\131', '\040', '\155', '\145', '\040', '\061', - '\012', '\146', '\156', '\126', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\142', '\132', '\040', '\155', '\145', '\040', '\061', - '\012', '\147', '\142', '\105', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\152', '\132', '\040', '\151', '\152', '\040', '\061', - '\012', '\106', '\160', '\171', '\040', '\160', '\162', '\040', '\061', - '\012', '\156', '\160', '\105', '\040', '\141', '\156', '\040', '\061', - '\012', '\122', '\170', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\157', '\127', '\160', '\040', '\157', '\156', '\040', '\061', - '\012', '\150', '\126', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\112', '\146', '\040', '\156', '\171', '\040', '\061', - '\012', '\163', '\121', '\144', '\040', '\163', '\164', '\040', '\061', - '\012', '\132', '\166', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\104', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\160', '\114', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\167', '\106', '\040', '\167', '\141', '\040', '\061', - '\012', '\170', '\102', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\113', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\130', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\111', '\165', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\147', '\102', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\112', '\160', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\147', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\116', '\150', '\040', '\150', '\157', '\040', '\061', - '\012', '\143', '\166', '\105', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\147', '\110', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\116', '\163', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\104', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\143', '\107', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\132', '\156', '\040', '\157', '\156', '\040', '\061', - '\012', '\165', '\125', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\154', '\121', '\040', '\154', '\145', '\040', '\061', - '\012', '\146', '\144', '\110', '\040', '\144', '\145', '\040', '\061', - '\012', '\145', '\132', '\152', '\040', '\145', '\162', '\040', '\061', - '\012', '\126', '\161', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\122', '\143', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\107', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\172', '\115', '\040', '\163', '\172', '\040', '\061', - '\012', '\121', '\160', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\123', '\160', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\143', '\107', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\161', '\101', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\142', '\113', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\145', '\127', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\153', '\103', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\172', '\102', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\165', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\117', '\171', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\115', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\161', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\161', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\167', '\114', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\120', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\123', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\120', '\153', '\040', '\144', '\145', '\040', '\061', - '\012', '\165', '\172', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\166', '\110', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\143', '\110', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\154', '\131', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\164', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\116', '\166', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\150', '\166', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\122', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\116', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\104', '\142', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\113', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\113', '\171', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\126', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\151', '\161', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\147', '\112', '\040', '\156', '\147', '\040', '\061', - '\012', '\145', '\112', '\163', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\117', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\162', '\130', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\161', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\127', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\142', '\124', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\103', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\141', '\117', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\157', '\103', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\156', '\105', '\040', '\141', '\156', '\040', '\061', - '\012', '\106', '\167', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\162', '\124', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\110', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\171', '\144', '\130', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\153', '\126', '\040', '\144', '\145', '\040', '\061', - '\012', '\122', '\161', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\171', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\130', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\157', '\112', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\170', '\111', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\132', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\154', '\132', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\167', '\130', '\040', '\163', '\172', '\040', '\061', - '\012', '\141', '\110', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\162', '\127', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\121', '\160', '\040', '\143', '\150', '\040', '\061', - '\012', '\112', '\167', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\145', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\121', '\152', '\040', '\163', '\164', '\040', '\061', - '\012', '\122', '\160', '\142', '\040', '\160', '\162', '\040', '\061', - '\012', '\155', '\132', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\102', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\155', '\170', '\126', '\040', '\155', '\145', '\040', '\061', - '\012', '\115', '\166', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\143', '\122', '\154', '\040', '\143', '\150', '\040', '\061', - '\012', '\106', '\172', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\102', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\127', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\166', '\161', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\111', '\170', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\171', '\150', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\171', '\121', '\040', '\167', '\141', '\040', '\061', - '\012', '\165', '\103', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\162', '\106', '\040', '\163', '\172', '\040', '\061', - '\012', '\151', '\171', '\121', '\040', '\151', '\156', '\040', '\061', - '\012', '\161', '\163', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\114', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\166', '\130', '\040', '\143', '\150', '\040', '\061', - '\012', '\123', '\143', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\162', '\114', '\040', '\145', '\162', '\040', '\061', - '\012', '\145', '\143', '\125', '\040', '\143', '\150', '\040', '\061', - '\012', '\126', '\170', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\103', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\166', '\130', '\040', '\157', '\156', '\040', '\061', - '\012', '\125', '\161', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\126', '\167', '\040', '\163', '\164', '\040', '\061', - '\012', '\163', '\160', '\130', '\040', '\163', '\164', '\040', '\061', - '\012', '\121', '\153', '\166', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\171', '\127', '\040', '\156', '\171', '\040', '\061', - '\012', '\162', '\102', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\144', '\103', '\040', '\144', '\145', '\040', '\061', - '\012', '\127', '\152', '\153', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\131', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\130', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\153', '\155', '\040', '\153', '\141', '\040', '\061', - '\012', '\150', '\150', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\104', '\166', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\143', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\132', '\171', '\040', '\167', '\141', '\040', '\061', - '\012', '\152', '\164', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\156', '\104', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\155', '\102', '\040', '\166', '\141', '\040', '\061', - '\012', '\153', '\152', '\102', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\144', '\107', '\040', '\143', '\150', '\040', '\061', - '\012', '\126', '\153', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\116', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\146', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\127', '\166', '\040', '\151', '\156', '\040', '\061', - '\012', '\127', '\164', '\156', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\146', '\105', '\040', '\154', '\145', '\040', '\061', - '\012', '\144', '\132', '\142', '\040', '\144', '\145', '\040', '\061', - '\012', '\145', '\161', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\125', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\167', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\125', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\107', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\167', '\130', '\040', '\141', '\156', '\040', '\061', - '\012', '\116', '\142', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\152', '\120', '\040', '\151', '\152', '\040', '\061', - '\012', '\163', '\161', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\121', '\146', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\132', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\127', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\115', '\170', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\106', '\151', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\152', '\130', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\104', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\104', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\125', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\150', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\110', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\124', '\152', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\165', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\132', '\160', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\126', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\106', '\160', '\040', '\156', '\147', '\040', '\061', - '\012', '\107', '\171', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\154', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\102', '\153', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\150', '\150', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\166', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\111', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\114', '\154', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\112', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\145', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\154', '\130', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\143', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\164', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\153', '\127', '\040', '\153', '\141', '\040', '\061', - '\012', '\147', '\112', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\121', '\171', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\120', '\172', '\040', '\163', '\164', '\040', '\061', - '\012', '\142', '\155', '\117', '\040', '\155', '\145', '\040', '\061', - '\012', '\131', '\164', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\161', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\151', '\102', '\153', '\040', '\151', '\156', '\040', '\061', - '\012', '\165', '\172', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\116', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\172', '\122', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\110', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\165', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\161', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\102', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\166', '\101', '\040', '\166', '\141', '\040', '\061', - '\012', '\145', '\126', '\152', '\040', '\145', '\162', '\040', '\061', - '\012', '\172', '\107', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\143', '\102', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\160', '\110', '\040', '\153', '\141', '\040', '\061', - '\012', '\155', '\104', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\166', '\165', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\126', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\155', '\172', '\123', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\166', '\115', '\040', '\151', '\152', '\040', '\061', - '\012', '\163', '\146', '\126', '\040', '\163', '\164', '\040', '\061', - '\012', '\150', '\121', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\124', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\120', '\154', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\170', '\112', '\040', '\146', '\157', '\040', '\061', - '\012', '\161', '\121', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\106', '\156', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\112', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\116', '\163', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\114', '\152', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\163', '\122', '\142', '\040', '\163', '\164', '\040', '\061', - '\012', '\160', '\143', '\131', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\126', '\155', '\040', '\166', '\141', '\040', '\061', - '\012', '\163', '\121', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\131', '\167', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\161', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\152', '\113', '\040', '\163', '\164', '\040', '\061', - '\012', '\132', '\153', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\115', '\152', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\104', '\167', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\142', '\116', '\040', '\167', '\141', '\040', '\061', - '\012', '\155', '\166', '\113', '\040', '\166', '\141', '\040', '\061', - '\012', '\162', '\114', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\114', '\142', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\167', '\152', '\117', '\040', '\151', '\152', '\040', '\061', - '\012', '\154', '\121', '\172', '\040', '\154', '\145', '\040', '\061', - '\012', '\113', '\167', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\155', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\142', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\143', '\113', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\161', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\126', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\170', '\143', '\106', '\040', '\143', '\150', '\040', '\061', - '\012', '\105', '\167', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\107', '\160', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\142', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\110', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\130', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\117', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\113', '\142', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\110', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\152', '\120', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\121', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\106', '\146', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\131', '\142', '\040', '\157', '\156', '\040', '\061', - '\012', '\106', '\161', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\130', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\111', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\160', '\115', '\146', '\040', '\160', '\162', '\040', '\061', - '\012', '\156', '\161', '\120', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\142', '\132', '\040', '\142', '\145', '\040', '\061', - '\012', '\150', '\163', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\152', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\132', '\161', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\120', '\170', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\102', '\172', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\160', '\142', '\111', '\040', '\160', '\162', '\040', '\061', - '\012', '\131', '\166', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\170', '\115', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\171', '\132', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\172', '\112', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\131', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\115', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\150', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\117', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\115', '\156', '\160', '\040', '\141', '\156', '\040', '\061', - '\012', '\111', '\146', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\131', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\170', '\166', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\146', '\107', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\161', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\114', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\153', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\157', '\131', '\153', '\040', '\157', '\156', '\040', '\061', - '\012', '\154', '\122', '\147', '\040', '\154', '\145', '\040', '\061', - '\012', '\154', '\117', '\170', '\040', '\154', '\145', '\040', '\061', - '\012', '\126', '\170', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\101', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\113', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\150', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\103', '\166', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\166', '\131', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\151', '\126', '\040', '\151', '\156', '\040', '\061', - '\012', '\143', '\162', '\106', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\105', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\122', '\162', '\154', '\040', '\145', '\162', '\040', '\061', - '\012', '\132', '\152', '\171', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\142', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\115', '\167', '\040', '\153', '\141', '\040', '\061', - '\012', '\166', '\132', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\106', '\170', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\172', '\153', '\123', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\113', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\142', '\111', '\040', '\163', '\172', '\040', '\061', - '\012', '\165', '\110', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\172', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\115', '\153', '\040', '\151', '\152', '\040', '\061', - '\012', '\106', '\153', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\113', '\155', '\040', '\144', '\145', '\040', '\061', - '\012', '\156', '\110', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\107', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\160', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\143', '\125', '\040', '\143', '\150', '\040', '\061', - '\012', '\141', '\127', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\144', '\123', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\150', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\141', '\110', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\155', '\111', '\040', '\166', '\141', '\040', '\061', - '\012', '\127', '\143', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\102', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\121', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\141', '\167', '\112', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\144', '\104', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\132', '\170', '\040', '\156', '\171', '\040', '\061', - '\012', '\113', '\153', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\102', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\172', '\101', '\040', '\154', '\145', '\040', '\061', - '\012', '\171', '\171', '\124', '\040', '\156', '\171', '\040', '\061', - '\012', '\161', '\145', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\160', '\105', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\106', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\171', '\107', '\040', '\156', '\171', '\040', '\061', - '\012', '\154', '\114', '\167', '\040', '\154', '\145', '\040', '\061', - '\012', '\142', '\166', '\123', '\040', '\166', '\141', '\040', '\061', - '\012', '\155', '\166', '\130', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\154', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\147', '\130', '\040', '\156', '\147', '\040', '\061', - '\012', '\154', '\121', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\155', '\131', '\040', '\155', '\145', '\040', '\061', - '\012', '\155', '\152', '\112', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\126', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\161', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\113', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\142', '\110', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\122', '\166', '\040', '\151', '\152', '\040', '\061', - '\012', '\114', '\160', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\172', '\120', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\153', '\122', '\040', '\153', '\141', '\040', '\061', - '\012', '\153', '\170', '\123', '\040', '\153', '\141', '\040', '\061', - '\012', '\152', '\127', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\116', '\153', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\113', '\143', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\112', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\170', '\167', '\132', '\040', '\167', '\141', '\040', '\061', - '\012', '\122', '\161', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\121', '\172', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\167', '\110', '\040', '\151', '\152', '\040', '\061', - '\012', '\104', '\161', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\114', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\130', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\146', '\104', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\152', '\130', '\040', '\163', '\164', '\040', '\061', - '\012', '\150', '\172', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\125', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\123', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\170', '\101', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\170', '\113', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\126', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\172', '\130', '\040', '\163', '\172', '\040', '\061', - '\012', '\125', '\143', '\163', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\141', '\110', '\040', '\141', '\156', '\040', '\061', - '\012', '\131', '\146', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\163', '\112', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\151', '\110', '\160', '\040', '\151', '\156', '\040', '\061', - '\012', '\151', '\171', '\103', '\040', '\151', '\156', '\040', '\061', - '\012', '\124', '\152', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\144', '\112', '\160', '\040', '\144', '\145', '\040', '\061', - '\012', '\112', '\147', '\166', '\040', '\156', '\147', '\040', '\061', - '\012', '\165', '\112', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\116', '\154', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\144', '\101', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\111', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\152', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\172', '\131', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\161', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\166', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\112', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\156', '\161', '\110', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\107', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\121', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\151', '\121', '\172', '\040', '\151', '\156', '\040', '\061', - '\012', '\164', '\114', '\156', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\126', '\152', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\161', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\162', '\116', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\113', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\141', '\126', '\040', '\141', '\156', '\040', '\061', - '\012', '\131', '\144', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\153', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\103', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\130', '\143', '\171', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\111', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\130', '\154', '\040', '\164', '\150', '\040', '\061', - '\012', '\141', '\106', '\163', '\040', '\141', '\156', '\040', '\061', - '\012', '\151', '\167', '\115', '\040', '\151', '\156', '\040', '\061', - '\012', '\107', '\167', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\130', '\154', '\160', '\040', '\154', '\145', '\040', '\061', - '\012', '\121', '\146', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\161', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\161', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\126', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\161', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\115', '\172', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\155', '\116', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\127', '\163', '\166', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\156', '\115', '\040', '\141', '\156', '\040', '\061', - '\012', '\165', '\123', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\103', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\152', '\110', '\040', '\163', '\172', '\040', '\061', - '\012', '\155', '\124', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\152', '\127', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\104', '\170', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\132', '\164', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\122', '\166', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\102', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\114', '\172', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\145', '\172', '\125', '\040', '\145', '\162', '\040', '\061', - '\012', '\152', '\161', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\152', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\104', '\143', '\147', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\102', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\150', '\117', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\160', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\161', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\103', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\162', '\122', '\166', '\040', '\145', '\162', '\040', '\061', - '\012', '\144', '\153', '\132', '\040', '\144', '\145', '\040', '\061', - '\012', '\107', '\147', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\121', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\107', '\143', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\123', '\143', '\147', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\104', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\142', '\104', '\040', '\160', '\162', '\040', '\061', - '\012', '\166', '\105', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\154', '\105', '\040', '\154', '\145', '\040', '\061', - '\012', '\122', '\152', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\154', '\106', '\167', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\161', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\141', '\120', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\152', '\104', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\143', '\105', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\123', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\104', '\147', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\165', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\120', '\166', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\112', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\121', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\167', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\160', '\101', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\107', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\130', '\172', '\040', '\143', '\150', '\040', '\061', - '\012', '\114', '\143', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\112', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\121', '\172', '\171', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\121', '\155', '\040', '\163', '\172', '\040', '\061', - '\012', '\110', '\150', '\156', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\144', '\131', '\040', '\144', '\145', '\040', '\061', - '\012', '\165', '\131', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\153', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\166', '\101', '\040', '\151', '\152', '\040', '\061', - '\012', '\112', '\166', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\151', '\167', '\132', '\040', '\151', '\156', '\040', '\061', - '\012', '\172', '\153', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\116', '\150', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\155', '\126', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\113', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\102', '\143', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\146', '\131', '\040', '\160', '\162', '\040', '\061', - '\012', '\161', '\125', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\161', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\167', '\117', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\130', '\155', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\110', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\102', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\165', '\120', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\112', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\111', '\160', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\161', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\161', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\113', '\142', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\146', '\114', '\040', '\166', '\141', '\040', '\061', - '\012', '\156', '\160', '\132', '\040', '\141', '\156', '\040', '\061', - '\012', '\157', '\161', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\161', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\172', '\125', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\116', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\130', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\103', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\156', '\172', '\112', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\113', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\155', '\102', '\040', '\155', '\145', '\040', '\061', - '\012', '\127', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\104', '\142', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\130', '\171', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\131', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\146', '\121', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\144', '\161', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\113', '\170', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\144', '\132', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\162', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\170', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\171', '\146', '\114', '\040', '\156', '\171', '\040', '\061', - '\012', '\171', '\131', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\163', '\142', '\110', '\040', '\163', '\164', '\040', '\061', - '\012', '\167', '\154', '\126', '\040', '\154', '\145', '\040', '\061', - '\012', '\165', '\113', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\150', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\170', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\114', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\156', '\121', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\161', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\116', '\161', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\146', '\104', '\040', '\151', '\152', '\040', '\061', - '\012', '\112', '\156', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\102', '\172', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\112', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\141', '\130', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\112', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\152', '\110', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\141', '\130', '\040', '\141', '\156', '\040', '\061', - '\012', '\127', '\150', '\163', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\131', '\162', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\155', '\123', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\150', '\171', '\040', '\164', '\150', '\040', '\061', - '\012', '\107', '\147', '\144', '\040', '\156', '\147', '\040', '\061', - '\012', '\130', '\155', '\171', '\040', '\155', '\145', '\040', '\061', - '\012', '\122', '\161', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\163', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\150', '\101', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\150', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\111', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\111', '\142', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\143', '\106', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\122', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\156', '\126', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\161', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\145', '\161', '\117', '\040', '\145', '\162', '\040', '\061', - '\012', '\107', '\153', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\116', '\156', '\172', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\161', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\112', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\166', '\101', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\115', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\167', '\123', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\101', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\103', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\155', '\105', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\150', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\167', '\105', '\040', '\145', '\162', '\040', '\061', - '\012', '\130', '\156', '\172', '\040', '\141', '\156', '\040', '\061', - '\012', '\125', '\150', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\156', '\122', '\040', '\141', '\156', '\040', '\061', - '\012', '\156', '\146', '\132', '\040', '\141', '\156', '\040', '\061', - '\012', '\121', '\160', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\161', '\170', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\107', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\122', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\122', '\167', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\164', '\143', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\102', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\122', '\152', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\146', '\131', '\040', '\144', '\145', '\040', '\061', - '\012', '\150', '\150', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\103', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\161', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\172', '\123', '\040', '\154', '\145', '\040', '\061', - '\012', '\114', '\162', '\155', '\040', '\145', '\162', '\040', '\061', - '\012', '\145', '\161', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\147', '\114', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\121', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\142', '\167', '\102', '\040', '\167', '\141', '\040', '\061', - '\012', '\154', '\107', '\146', '\040', '\154', '\145', '\040', '\061', - '\012', '\116', '\167', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\144', '\125', '\040', '\163', '\164', '\040', '\061', - '\012', '\132', '\170', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\171', '\104', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\114', '\163', '\167', '\040', '\163', '\164', '\040', '\061', - '\012', '\143', '\116', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\104', '\161', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\114', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\127', '\166', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\153', '\121', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\152', '\104', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\131', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\145', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\166', '\114', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\153', '\101', '\040', '\153', '\141', '\040', '\061', - '\012', '\116', '\166', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\144', '\152', '\115', '\040', '\144', '\145', '\040', '\061', - '\012', '\150', '\147', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\130', '\142', '\040', '\160', '\162', '\040', '\061', - '\012', '\124', '\154', '\167', '\040', '\154', '\145', '\040', '\061', - '\012', '\122', '\150', '\172', '\040', '\150', '\141', '\040', '\061', - '\012', '\167', '\153', '\120', '\040', '\153', '\141', '\040', '\061', - '\012', '\167', '\104', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\145', '\106', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\145', '\150', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\154', '\171', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\170', '\113', '\040', '\167', '\141', '\040', '\061', - '\012', '\144', '\120', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\106', '\144', '\040', '\163', '\164', '\040', '\061', - '\012', '\166', '\143', '\111', '\040', '\143', '\150', '\040', '\061', - '\012', '\106', '\170', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\166', '\122', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\161', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\115', '\152', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\142', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\160', '\120', '\040', '\153', '\141', '\040', '\061', - '\012', '\102', '\166', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\124', '\155', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\150', '\142', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\115', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\147', '\114', '\040', '\156', '\147', '\040', '\061', - '\012', '\145', '\146', '\125', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\121', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\143', '\101', '\040', '\143', '\150', '\040', '\061', - '\012', '\105', '\167', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\155', '\126', '\040', '\155', '\145', '\040', '\061', - '\012', '\121', '\143', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\172', '\107', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\113', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\106', '\167', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\122', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\120', '\153', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\115', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\172', '\117', '\040', '\163', '\172', '\040', '\061', - '\012', '\157', '\106', '\167', '\040', '\157', '\156', '\040', '\061', - '\012', '\150', '\112', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\126', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\151', '\126', '\172', '\040', '\151', '\156', '\040', '\061', - '\012', '\157', '\161', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\150', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\117', '\170', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\121', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\130', '\146', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\143', '\116', '\167', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\147', '\132', '\040', '\156', '\147', '\040', '\061', - '\012', '\124', '\166', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\163', '\111', '\170', '\040', '\163', '\164', '\040', '\061', - '\012', '\165', '\132', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\172', '\130', '\040', '\163', '\172', '\040', '\061', - '\012', '\131', '\154', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\110', '\146', '\040', '\157', '\156', '\040', '\061', - '\012', '\143', '\163', '\125', '\040', '\143', '\150', '\040', '\061', - '\012', '\121', '\172', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\102', '\146', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\112', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\147', '\121', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\170', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\124', '\156', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\113', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\142', '\161', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\152', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\160', '\106', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\166', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\153', '\146', '\102', '\040', '\153', '\141', '\040', '\061', - '\012', '\155', '\132', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\103', '\163', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\162', '\112', '\040', '\145', '\162', '\040', '\061', - '\012', '\107', '\146', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\152', '\142', '\120', '\040', '\151', '\152', '\040', '\061', - '\012', '\131', '\166', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\110', '\170', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\154', '\162', '\104', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\124', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\141', '\102', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\107', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\155', '\150', '\123', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\124', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\153', '\122', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\127', '\160', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\116', '\160', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\154', '\167', '\123', '\040', '\154', '\145', '\040', '\061', - '\012', '\155', '\107', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\156', '\161', '\124', '\040', '\141', '\156', '\040', '\061', - '\012', '\125', '\152', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\152', '\117', '\040', '\151', '\152', '\040', '\061', - '\012', '\144', '\115', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\113', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\132', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\116', '\152', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\131', '\154', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\155', '\126', '\146', '\040', '\155', '\145', '\040', '\061', - '\012', '\147', '\132', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\110', '\143', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\143', '\102', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\115', '\155', '\040', '\153', '\141', '\040', '\061', - '\012', '\154', '\167', '\103', '\040', '\154', '\145', '\040', '\061', - '\012', '\104', '\156', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\152', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\124', '\153', '\040', '\145', '\162', '\040', '\061', - '\012', '\126', '\172', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\126', '\170', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\167', '\154', '\121', '\040', '\154', '\145', '\040', '\061', - '\012', '\116', '\162', '\166', '\040', '\145', '\162', '\040', '\061', - '\012', '\160', '\152', '\120', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\167', '\132', '\040', '\167', '\141', '\040', '\061', - '\012', '\164', '\156', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\157', '\112', '\167', '\040', '\157', '\156', '\040', '\061', - '\012', '\153', '\112', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\126', '\160', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\101', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\150', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\103', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\162', '\125', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\122', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\154', '\103', '\040', '\143', '\150', '\040', '\061', - '\012', '\162', '\106', '\144', '\040', '\145', '\162', '\040', '\061', - '\012', '\164', '\167', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\103', '\167', '\040', '\153', '\141', '\040', '\061', - '\012', '\155', '\123', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\130', '\156', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\130', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\124', '\167', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\106', '\167', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\152', '\112', '\040', '\151', '\152', '\040', '\061', - '\012', '\154', '\142', '\121', '\040', '\154', '\145', '\040', '\061', - '\012', '\153', '\166', '\123', '\040', '\153', '\141', '\040', '\061', - '\012', '\123', '\155', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\102', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\116', '\172', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\121', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\166', '\114', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\126', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\125', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\132', '\144', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\111', '\171', '\040', '\145', '\147', '\040', '\061', - '\012', '\150', '\126', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\141', '\121', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\121', '\146', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\154', '\113', '\142', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\150', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\142', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\107', '\143', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\142', '\124', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\131', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\130', '\166', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\115', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\165', '\110', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\130', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\163', '\116', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\126', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\160', '\117', '\040', '\143', '\150', '\040', '\061', - '\012', '\106', '\147', '\142', '\040', '\156', '\147', '\040', '\061', - '\012', '\145', '\127', '\154', '\040', '\145', '\162', '\040', '\061', - '\012', '\153', '\113', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\103', '\142', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\155', '\146', '\110', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\111', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\146', '\130', '\040', '\163', '\164', '\040', '\061', - '\012', '\163', '\156', '\110', '\040', '\141', '\156', '\040', '\061', - '\012', '\110', '\152', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\114', '\155', '\146', '\040', '\155', '\145', '\040', '\061', - '\012', '\170', '\147', '\146', '\040', '\156', '\147', '\040', '\061', - '\012', '\105', '\166', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\117', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\110', '\152', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\165', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\132', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\154', '\116', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\125', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\156', '\114', '\163', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\153', '\123', '\040', '\151', '\152', '\040', '\061', - '\012', '\107', '\166', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\120', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\167', '\121', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\162', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\142', '\110', '\040', '\142', '\145', '\040', '\061', - '\012', '\147', '\150', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\115', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\131', '\166', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\114', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\102', '\144', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\112', '\144', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\122', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\166', '\147', '\120', '\040', '\156', '\147', '\040', '\061', - '\012', '\110', '\150', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\160', '\114', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\106', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\123', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\144', '\103', '\040', '\144', '\145', '\040', '\061', - '\012', '\153', '\107', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\126', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\166', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\167', '\117', '\040', '\153', '\141', '\040', '\061', - '\012', '\112', '\161', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\127', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\163', '\121', '\153', '\040', '\163', '\164', '\040', '\061', - '\012', '\150', '\156', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\162', '\104', '\040', '\145', '\162', '\040', '\061', - '\012', '\152', '\126', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\166', '\131', '\040', '\166', '\141', '\040', '\061', - '\012', '\142', '\146', '\111', '\040', '\142', '\145', '\040', '\061', - '\012', '\146', '\123', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\103', '\172', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\153', '\127', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\112', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\107', '\167', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\154', '\106', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\160', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\146', '\153', '\126', '\040', '\153', '\141', '\040', '\061', - '\012', '\143', '\131', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\162', '\127', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\102', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\112', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\111', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\144', '\101', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\121', '\171', '\040', '\167', '\141', '\040', '\061', - '\012', '\167', '\103', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\161', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\146', '\130', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\164', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\153', '\112', '\040', '\153', '\141', '\040', '\061', - '\012', '\121', '\172', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\113', '\163', '\040', '\156', '\147', '\040', '\061', - '\012', '\121', '\172', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\142', '\167', '\111', '\040', '\167', '\141', '\040', '\061', - '\012', '\124', '\163', '\142', '\040', '\163', '\164', '\040', '\061', - '\012', '\166', '\166', '\130', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\154', '\122', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\154', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\142', '\130', '\040', '\144', '\145', '\040', '\061', - '\012', '\110', '\146', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\102', '\163', '\152', '\040', '\163', '\164', '\040', '\061', - '\012', '\131', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\156', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\172', '\132', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\107', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\147', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\167', '\105', '\040', '\167', '\141', '\040', '\061', - '\012', '\117', '\171', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\121', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\122', '\171', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\155', '\130', '\040', '\155', '\145', '\040', '\061', - '\012', '\154', '\132', '\170', '\040', '\154', '\145', '\040', '\061', - '\012', '\147', '\106', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\112', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\113', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\111', '\153', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\153', '\107', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\107', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\122', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\104', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\166', '\114', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\107', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\151', '\111', '\152', '\040', '\151', '\156', '\040', '\061', - '\012', '\107', '\172', '\144', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\114', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\152', '\125', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\121', '\166', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\126', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\150', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\126', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\143', '\156', '\115', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\106', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\130', '\146', '\040', '\155', '\145', '\040', '\061', - '\012', '\162', '\103', '\142', '\040', '\145', '\162', '\040', '\061', - '\012', '\156', '\114', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\146', '\110', '\040', '\146', '\157', '\040', '\061', - '\012', '\151', '\161', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\150', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\110', '\170', '\040', '\163', '\164', '\040', '\061', - '\012', '\131', '\167', '\171', '\040', '\167', '\141', '\040', '\061', - '\012', '\155', '\104', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\143', '\102', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\102', '\155', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\122', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\123', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\103', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\124', '\143', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\141', '\132', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\112', '\143', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\156', '\142', '\106', '\040', '\141', '\156', '\040', '\061', - '\012', '\121', '\172', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\153', '\121', '\040', '\153', '\141', '\040', '\061', - '\012', '\150', '\172', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\110', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\150', '\161', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\105', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\171', '\152', '\106', '\040', '\151', '\152', '\040', '\061', - '\012', '\120', '\152', '\153', '\040', '\151', '\152', '\040', '\061', - '\012', '\163', '\146', '\125', '\040', '\163', '\164', '\040', '\061', - '\012', '\142', '\107', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\143', '\130', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\130', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\166', '\123', '\040', '\166', '\141', '\040', '\061', - '\012', '\160', '\115', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\112', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\126', '\167', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\103', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\144', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\122', '\152', '\040', '\145', '\162', '\040', '\061', - '\012', '\121', '\150', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\143', '\107', '\040', '\143', '\150', '\040', '\061', - '\012', '\157', '\105', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\121', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\154', '\123', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\114', '\161', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\154', '\110', '\040', '\141', '\156', '\040', '\061', - '\012', '\165', '\161', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\117', '\141', '\157', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\154', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\120', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\164', '\111', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\111', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\155', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\112', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\126', '\147', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\125', '\153', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\164', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\150', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\164', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\172', '\144', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\170', '\121', '\040', '\156', '\171', '\040', '\061', - '\012', '\156', '\162', '\120', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\110', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\131', '\143', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\107', '\161', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\106', '\147', '\171', '\040', '\156', '\147', '\040', '\061', - '\012', '\157', '\102', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\165', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\102', '\156', '\172', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\120', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\106', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\152', '\144', '\112', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\107', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\131', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\152', '\160', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\124', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\117', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\114', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\163', '\115', '\146', '\040', '\163', '\164', '\040', '\061', - '\012', '\157', '\126', '\154', '\040', '\157', '\156', '\040', '\061', - '\012', '\143', '\167', '\116', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\147', '\122', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\152', '\121', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\172', '\122', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\150', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\142', '\122', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\147', '\127', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\167', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\116', '\170', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\145', '\121', '\157', '\040', '\145', '\162', '\040', '\061', - '\012', '\155', '\121', '\160', '\040', '\155', '\145', '\040', '\061', - '\012', '\113', '\161', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\166', '\101', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\154', '\112', '\040', '\154', '\145', '\040', '\061', - '\012', '\171', '\126', '\170', '\040', '\156', '\171', '\040', '\061', - '\012', '\163', '\120', '\146', '\040', '\163', '\164', '\040', '\061', - '\012', '\144', '\121', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\163', '\132', '\142', '\040', '\163', '\164', '\040', '\061', - '\012', '\172', '\150', '\123', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\127', '\142', '\040', '\153', '\141', '\040', '\061', - '\012', '\155', '\161', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\106', '\146', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\161', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\161', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\124', '\154', '\171', '\040', '\154', '\145', '\040', '\061', - '\012', '\153', '\160', '\114', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\105', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\115', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\122', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\163', '\103', '\040', '\163', '\164', '\040', '\061', - '\012', '\152', '\154', '\123', '\040', '\154', '\145', '\040', '\061', - '\012', '\154', '\172', '\115', '\040', '\154', '\145', '\040', '\061', - '\012', '\120', '\146', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\165', '\112', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\126', '\146', '\040', '\156', '\171', '\040', '\061', - '\012', '\132', '\147', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\142', '\123', '\040', '\142', '\145', '\040', '\061', - '\012', '\157', '\106', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\166', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\143', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\167', '\125', '\040', '\167', '\141', '\040', '\061', - '\012', '\171', '\103', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\120', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\163', '\112', '\144', '\040', '\163', '\164', '\040', '\061', - '\012', '\142', '\155', '\116', '\040', '\155', '\145', '\040', '\061', - '\012', '\165', '\126', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\144', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\167', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\126', '\155', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\110', '\161', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\146', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\101', '\171', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\170', '\113', '\040', '\156', '\171', '\040', '\061', - '\012', '\110', '\167', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\111', '\160', '\040', '\156', '\147', '\040', '\061', - '\012', '\132', '\147', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\164', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\114', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\116', '\153', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\115', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\170', '\106', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\102', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\167', '\110', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\121', '\172', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\131', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\120', '\166', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\160', '\166', '\131', '\040', '\166', '\141', '\040', '\061', - '\012', '\112', '\170', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\147', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\161', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\154', '\114', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\115', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\123', '\142', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\105', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\146', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\143', '\123', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\103', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\110', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\172', '\153', '\106', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\165', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\124', '\142', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\111', '\160', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\131', '\172', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\121', '\167', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\106', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\120', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\104', '\160', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\112', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\160', '\116', '\040', '\160', '\162', '\040', '\061', - '\012', '\167', '\172', '\105', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\161', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\167', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\157', '\121', '\170', '\040', '\157', '\156', '\040', '\061', - '\012', '\154', '\103', '\160', '\040', '\154', '\145', '\040', '\061', - '\012', '\115', '\150', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\124', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\125', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\150', '\147', '\105', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\143', '\102', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\160', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\161', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\102', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\111', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\161', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\120', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\163', '\115', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\130', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\152', '\113', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\162', '\172', '\040', '\145', '\162', '\040', '\061', - '\012', '\110', '\167', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\146', '\127', '\040', '\156', '\171', '\040', '\061', - '\012', '\131', '\171', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\131', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\166', '\122', '\040', '\166', '\141', '\040', '\061', - '\012', '\163', '\122', '\172', '\040', '\163', '\164', '\040', '\061', - '\012', '\113', '\171', '\170', '\040', '\156', '\171', '\040', '\061', - '\012', '\156', '\170', '\122', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\144', '\112', '\040', '\143', '\150', '\040', '\061', - '\012', '\116', '\167', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\142', '\105', '\040', '\164', '\150', '\040', '\061', - '\012', '\157', '\145', '\132', '\040', '\145', '\162', '\040', '\061', - '\012', '\142', '\143', '\121', '\040', '\143', '\150', '\040', '\061', - '\012', '\123', '\167', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\111', '\153', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\102', '\166', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\150', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\161', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\113', '\142', '\040', '\153', '\141', '\040', '\061', - '\012', '\127', '\144', '\153', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\160', '\120', '\040', '\160', '\162', '\040', '\061', - '\012', '\153', '\121', '\171', '\040', '\153', '\141', '\040', '\061', - '\012', '\102', '\161', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\146', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\120', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\101', '\157', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\154', '\112', '\040', '\154', '\145', '\040', '\061', - '\012', '\131', '\156', '\166', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\115', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\121', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\141', '\146', '\115', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\166', '\117', '\040', '\151', '\152', '\040', '\061', - '\012', '\145', '\110', '\146', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\121', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\161', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\112', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\131', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\145', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\113', '\160', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\153', '\146', '\127', '\040', '\153', '\141', '\040', '\061', - '\012', '\127', '\144', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\142', '\116', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\102', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\163', '\165', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\105', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\146', '\132', '\040', '\145', '\162', '\040', '\061', - '\012', '\157', '\110', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\145', '\106', '\167', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\120', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\153', '\104', '\142', '\040', '\153', '\141', '\040', '\061', - '\012', '\164', '\132', '\156', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\143', '\113', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\127', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\125', '\170', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\171', '\121', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\132', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\152', '\166', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\147', '\117', '\040', '\156', '\147', '\040', '\061', - '\012', '\157', '\152', '\121', '\040', '\157', '\156', '\040', '\061', - '\012', '\113', '\167', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\106', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\115', '\144', '\040', '\163', '\164', '\040', '\061', - '\012', '\115', '\146', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\115', '\172', '\171', '\040', '\163', '\172', '\040', '\061', - '\012', '\116', '\167', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\171', '\167', '\124', '\040', '\167', '\141', '\040', '\061', - '\012', '\167', '\114', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\110', '\161', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\163', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\116', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\125', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\156', '\122', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\122', '\154', '\153', '\040', '\154', '\145', '\040', '\061', - '\012', '\102', '\161', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\146', '\111', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\126', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\107', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\154', '\130', '\040', '\154', '\145', '\040', '\061', - '\012', '\153', '\146', '\107', '\040', '\153', '\141', '\040', '\061', - '\012', '\167', '\126', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\143', '\144', '\105', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\172', '\105', '\040', '\164', '\150', '\040', '\061', - '\012', '\104', '\150', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\172', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\166', '\114', '\040', '\166', '\141', '\040', '\061', - '\012', '\142', '\172', '\121', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\126', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\132', '\170', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\114', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\124', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\161', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\155', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\154', '\104', '\040', '\154', '\145', '\040', '\061', - '\012', '\113', '\143', '\144', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\104', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\166', '\131', '\040', '\153', '\141', '\040', '\061', - '\012', '\143', '\121', '\154', '\040', '\143', '\150', '\040', '\061', - '\012', '\111', '\170', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\163', '\107', '\146', '\040', '\163', '\164', '\040', '\061', - '\012', '\147', '\106', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\122', '\153', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\110', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\103', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\102', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\112', '\167', '\040', '\163', '\164', '\040', '\061', - '\012', '\143', '\127', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\130', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\110', '\150', '\154', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\152', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\154', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\110', '\170', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\172', '\162', '\105', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\153', '\110', '\040', '\156', '\147', '\040', '\061', - '\012', '\165', '\110', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\172', '\155', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\102', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\146', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\114', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\125', '\161', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\153', '\104', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\161', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\114', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\131', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\113', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\111', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\156', '\162', '\125', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\106', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\163', '\142', '\103', '\040', '\163', '\164', '\040', '\061', - '\012', '\155', '\107', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\130', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\120', '\153', '\166', '\040', '\153', '\141', '\040', '\061', - '\012', '\103', '\161', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\103', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\162', '\116', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\167', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\112', '\147', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\154', '\121', '\040', '\154', '\145', '\040', '\061', - '\012', '\147', '\102', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\111', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\157', '\144', '\121', '\040', '\157', '\156', '\040', '\061', - '\012', '\121', '\156', '\172', '\040', '\141', '\156', '\040', '\061', - '\012', '\125', '\172', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\112', '\160', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\170', '\130', '\040', '\156', '\147', '\040', '\061', - '\012', '\132', '\153', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\130', '\153', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\150', '\122', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\143', '\126', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\115', '\155', '\040', '\163', '\172', '\040', '\061', - '\012', '\145', '\102', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\110', '\144', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\170', '\125', '\040', '\142', '\145', '\040', '\061', - '\012', '\170', '\144', '\113', '\040', '\144', '\145', '\040', '\061', - '\012', '\155', '\121', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\131', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\154', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\122', '\172', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\107', '\172', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\106', '\172', '\040', '\172', '\145', '\040', '\061', - '\012', '\161', '\117', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\147', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\157', '\107', '\155', '\040', '\157', '\156', '\040', '\061', - '\012', '\130', '\156', '\160', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\131', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\165', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\116', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\172', '\161', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\103', '\160', '\040', '\153', '\141', '\040', '\061', - '\012', '\127', '\150', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\121', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\167', '\101', '\040', '\166', '\141', '\040', '\061', - '\012', '\126', '\143', '\147', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\127', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\110', '\161', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\103', '\160', '\171', '\040', '\160', '\162', '\040', '\061', - '\012', '\172', '\143', '\114', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\146', '\106', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\130', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\141', '\130', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\123', '\167', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\150', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\170', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\107', '\161', '\165', '\040', '\165', '\156', '\040', '\061', - '\012', '\125', '\170', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\144', '\113', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\132', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\167', '\112', '\040', '\155', '\145', '\040', '\061', - '\012', '\143', '\166', '\104', '\040', '\143', '\150', '\040', '\061', - '\012', '\154', '\142', '\132', '\040', '\154', '\145', '\040', '\061', - '\012', '\120', '\172', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\144', '\117', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\112', '\156', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\127', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\130', '\171', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\165', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\130', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\170', '\156', '\114', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\115', '\146', '\040', '\156', '\147', '\040', '\061', - '\012', '\162', '\116', '\146', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\121', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\161', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\106', '\172', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\160', '\124', '\040', '\166', '\141', '\040', '\061', - '\012', '\116', '\167', '\171', '\040', '\167', '\141', '\040', '\061', - '\012', '\171', '\161', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\150', '\117', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\126', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\131', '\142', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\166', '\116', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\111', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\161', '\161', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\142', '\106', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\115', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\124', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\122', '\150', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\127', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\114', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\163', '\104', '\040', '\163', '\164', '\040', '\061', - '\012', '\165', '\115', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\110', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\147', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\114', '\155', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\166', '\153', '\125', '\040', '\153', '\141', '\040', '\061', - '\012', '\154', '\101', '\170', '\040', '\154', '\145', '\040', '\061', - '\012', '\113', '\172', '\144', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\113', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\121', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\147', '\106', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\171', '\130', '\040', '\167', '\141', '\040', '\061', - '\012', '\172', '\146', '\125', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\160', '\125', '\040', '\160', '\162', '\040', '\061', - '\012', '\171', '\167', '\112', '\040', '\167', '\141', '\040', '\061', - '\012', '\101', '\171', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\111', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\165', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\146', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\102', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\110', '\164', '\171', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\122', '\166', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\124', '\142', '\040', '\160', '\162', '\040', '\061', - '\012', '\125', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\124', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\112', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\125', '\151', '\167', '\040', '\151', '\156', '\040', '\061', - '\012', '\112', '\154', '\160', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\120', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\103', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\154', '\161', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\154', '\132', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\117', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\153', '\154', '\113', '\040', '\154', '\145', '\040', '\061', - '\012', '\153', '\146', '\121', '\040', '\153', '\141', '\040', '\061', - '\012', '\165', '\112', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\153', '\120', '\040', '\153', '\141', '\040', '\061', - '\012', '\107', '\161', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\154', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\171', '\104', '\040', '\156', '\171', '\040', '\061', - '\012', '\152', '\150', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\162', '\126', '\040', '\143', '\150', '\040', '\061', - '\012', '\104', '\167', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\171', '\152', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\160', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\155', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\127', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\120', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\125', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\142', '\122', '\040', '\141', '\156', '\040', '\061', - '\012', '\131', '\144', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\121', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\155', '\104', '\040', '\155', '\145', '\040', '\061', - '\012', '\112', '\153', '\152', '\040', '\153', '\141', '\040', '\061', - '\012', '\152', '\124', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\167', '\131', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\132', '\172', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\162', '\153', '\121', '\040', '\145', '\162', '\040', '\061', - '\012', '\142', '\104', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\161', '\123', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\130', '\162', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\132', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\116', '\147', '\160', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\161', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\166', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\127', '\142', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\167', '\166', '\113', '\040', '\166', '\141', '\040', '\061', - '\012', '\143', '\112', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\115', '\167', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\144', '\112', '\040', '\144', '\145', '\040', '\061', - '\012', '\151', '\167', '\105', '\040', '\151', '\156', '\040', '\061', - '\012', '\142', '\170', '\130', '\040', '\142', '\145', '\040', '\061', - '\012', '\152', '\170', '\124', '\040', '\151', '\152', '\040', '\061', - '\012', '\131', '\143', '\156', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\115', '\146', '\040', '\167', '\141', '\040', '\061', - '\012', '\142', '\161', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\161', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\122', '\152', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\131', '\171', '\040', '\167', '\141', '\040', '\061', - '\012', '\124', '\170', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\162', '\116', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\126', '\165', '\040', '\165', '\156', '\040', '\061', - '\012', '\155', '\122', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\106', '\152', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\171', '\121', '\040', '\156', '\171', '\040', '\061', - '\012', '\170', '\145', '\111', '\040', '\145', '\162', '\040', '\061', - '\012', '\127', '\161', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\154', '\171', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\104', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\131', '\172', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\102', '\170', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\167', '\114', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\161', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\147', '\113', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\161', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\163', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\106', '\161', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\130', '\172', '\040', '\145', '\162', '\040', '\061', - '\012', '\154', '\112', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\105', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\103', '\142', '\040', '\141', '\156', '\040', '\061', - '\012', '\130', '\162', '\144', '\040', '\145', '\162', '\040', '\061', - '\012', '\122', '\172', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\146', '\127', '\040', '\156', '\147', '\040', '\061', - '\012', '\130', '\164', '\154', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\124', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\165', '\146', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\152', '\121', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\154', '\127', '\040', '\154', '\145', '\040', '\061', - '\012', '\144', '\161', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\150', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\167', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\156', '\127', '\040', '\141', '\156', '\040', '\061', - '\012', '\122', '\146', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\113', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\153', '\106', '\167', '\040', '\153', '\141', '\040', '\061', - '\012', '\121', '\165', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\130', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\126', '\153', '\167', '\040', '\153', '\141', '\040', '\061', - '\012', '\164', '\106', '\150', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\111', '\165', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\124', '\146', '\040', '\154', '\145', '\040', '\061', - '\012', '\115', '\167', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\166', '\124', '\040', '\166', '\141', '\040', '\061', - '\012', '\153', '\113', '\160', '\040', '\153', '\141', '\040', '\061', - '\012', '\164', '\122', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\130', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\166', '\172', '\114', '\040', '\163', '\172', '\040', '\061', - '\012', '\112', '\143', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\124', '\142', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\144', '\121', '\040', '\144', '\145', '\040', '\061', - '\012', '\122', '\142', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\112', '\162', '\155', '\040', '\145', '\162', '\040', '\061', - '\012', '\163', '\122', '\152', '\040', '\163', '\164', '\040', '\061', - '\012', '\172', '\127', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\156', '\105', '\040', '\141', '\156', '\040', '\061', - '\012', '\113', '\143', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\121', '\161', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\160', '\111', '\040', '\160', '\162', '\040', '\061', - '\012', '\151', '\116', '\167', '\040', '\151', '\156', '\040', '\061', - '\012', '\165', '\152', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\110', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\166', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\110', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\166', '\112', '\040', '\166', '\141', '\040', '\061', - '\012', '\156', '\161', '\131', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\160', '\105', '\040', '\167', '\141', '\040', '\061', - '\012', '\110', '\167', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\170', '\172', '\111', '\040', '\163', '\172', '\040', '\061', - '\012', '\103', '\147', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\127', '\144', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\165', '\126', '\040', '\165', '\156', '\040', '\061', - '\012', '\142', '\152', '\116', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\121', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\142', '\170', '\105', '\040', '\142', '\145', '\040', '\061', - '\012', '\165', '\126', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\162', '\154', '\040', '\145', '\162', '\040', '\061', - '\012', '\114', '\162', '\170', '\040', '\145', '\162', '\040', '\061', - '\012', '\111', '\167', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\141', '\161', '\102', '\040', '\141', '\156', '\040', '\061', - '\012', '\126', '\143', '\160', '\040', '\143', '\150', '\040', '\061', - '\012', '\127', '\167', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\141', '\107', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\120', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\106', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\147', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\163', '\144', '\040', '\163', '\164', '\040', '\061', - '\012', '\126', '\170', '\163', '\040', '\163', '\172', '\040', '\061', - '\012', '\113', '\150', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\123', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\157', '\107', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\172', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\161', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\160', '\121', '\040', '\155', '\145', '\040', '\061', - '\012', '\113', '\143', '\160', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\167', '\104', '\040', '\163', '\164', '\040', '\061', - '\012', '\162', '\132', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\131', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\165', '\112', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\127', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\163', '\166', '\117', '\040', '\163', '\164', '\040', '\061', - '\012', '\160', '\106', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\131', '\152', '\170', '\040', '\151', '\152', '\040', '\061', - '\012', '\164', '\160', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\126', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\116', '\155', '\040', '\163', '\164', '\040', '\061', - '\012', '\154', '\113', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\166', '\125', '\040', '\141', '\156', '\040', '\061', - '\012', '\110', '\170', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\160', '\165', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\112', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\170', '\122', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\101', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\131', '\161', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\120', '\167', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\155', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\154', '\112', '\040', '\154', '\145', '\040', '\061', - '\012', '\155', '\161', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\103', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\132', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\141', '\106', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\157', '\131', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\120', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\144', '\112', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\167', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\103', '\143', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\106', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\162', '\131', '\040', '\145', '\162', '\040', '\061', - '\012', '\103', '\144', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\114', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\170', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\115', '\170', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\143', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\126', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\153', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\170', '\105', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\166', '\124', '\040', '\166', '\141', '\040', '\061', - '\012', '\115', '\154', '\167', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\164', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\107', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\152', '\105', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\152', '\115', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\167', '\120', '\040', '\151', '\152', '\040', '\061', - '\012', '\113', '\170', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\106', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\127', '\143', '\147', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\150', '\132', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\172', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\164', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\166', '\113', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\126', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\120', '\167', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\170', '\161', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\171', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\103', '\155', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\152', '\125', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\107', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\115', '\161', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\117', '\143', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\161', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\122', '\142', '\040', '\154', '\145', '\040', '\061', - '\012', '\164', '\146', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\132', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\132', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\160', '\132', '\040', '\156', '\147', '\040', '\061', - '\012', '\106', '\160', '\146', '\040', '\160', '\162', '\040', '\061', - '\012', '\161', '\164', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\150', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\161', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\147', '\107', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\157', '\124', '\040', '\157', '\156', '\040', '\061', - '\012', '\172', '\123', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\170', '\123', '\040', '\167', '\141', '\040', '\061', - '\012', '\127', '\162', '\146', '\040', '\145', '\162', '\040', '\061', - '\012', '\117', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\114', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\121', '\172', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\130', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\164', '\144', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\161', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\130', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\153', '\102', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\151', '\161', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\117', '\143', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\125', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\152', '\130', '\153', '\040', '\151', '\152', '\040', '\061', - '\012', '\150', '\142', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\143', '\147', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\167', '\123', '\040', '\167', '\141', '\040', '\061', - '\012', '\143', '\126', '\155', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\167', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\167', '\107', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\163', '\115', '\040', '\163', '\164', '\040', '\061', - '\012', '\120', '\161', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\120', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\167', '\107', '\040', '\167', '\141', '\040', '\061', - '\012', '\130', '\167', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\167', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\161', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\155', '\131', '\040', '\166', '\141', '\040', '\061', - '\012', '\165', '\166', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\146', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\142', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\116', '\146', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\160', '\110', '\040', '\160', '\162', '\040', '\061', - '\012', '\171', '\112', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\161', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\143', '\126', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\147', '\115', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\121', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\150', '\166', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\114', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\143', '\145', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\106', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\162', '\102', '\155', '\040', '\145', '\162', '\040', '\061', - '\012', '\155', '\144', '\126', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\106', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\156', '\130', '\040', '\141', '\156', '\040', '\061', - '\012', '\156', '\115', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\103', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\103', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\112', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\103', '\146', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\103', '\170', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\146', '\117', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\141', '\112', '\172', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\114', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\155', '\130', '\040', '\155', '\145', '\040', '\061', - '\012', '\131', '\146', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\144', '\112', '\146', '\040', '\144', '\145', '\040', '\061', - '\012', '\105', '\141', '\171', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\123', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\152', '\121', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\116', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\116', '\166', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\153', '\130', '\040', '\153', '\141', '\040', '\061', - '\012', '\112', '\167', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\152', '\166', '\114', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\160', '\110', '\040', '\160', '\162', '\040', '\061', - '\012', '\160', '\170', '\117', '\040', '\160', '\162', '\040', '\061', - '\012', '\166', '\120', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\144', '\127', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\142', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\157', '\105', '\040', '\157', '\156', '\040', '\061', - '\012', '\147', '\164', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\146', '\106', '\040', '\142', '\145', '\040', '\061', - '\012', '\155', '\166', '\127', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\163', '\115', '\040', '\163', '\164', '\040', '\061', - '\012', '\167', '\114', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\167', '\110', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\103', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\114', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\153', '\130', '\167', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\126', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\150', '\103', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\157', '\125', '\153', '\040', '\157', '\156', '\040', '\061', - '\012', '\172', '\143', '\106', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\115', '\166', '\040', '\163', '\164', '\040', '\061', - '\012', '\144', '\162', '\132', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\146', '\117', '\040', '\167', '\141', '\040', '\061', - '\012', '\171', '\106', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\130', '\141', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\115', '\165', '\040', '\165', '\156', '\040', '\061', - '\012', '\146', '\103', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\167', '\103', '\040', '\167', '\141', '\040', '\061', - '\012', '\157', '\124', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\106', '\153', '\155', '\040', '\153', '\141', '\040', '\061', - '\012', '\145', '\121', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\120', '\170', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\153', '\152', '\107', '\040', '\151', '\152', '\040', '\061', - '\012', '\164', '\107', '\163', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\161', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\155', '\130', '\040', '\155', '\145', '\040', '\061', - '\012', '\170', '\131', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\153', '\111', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\166', '\104', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\153', '\166', '\103', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\164', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\120', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\160', '\116', '\040', '\144', '\145', '\040', '\061', - '\012', '\150', '\116', '\162', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\156', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\110', '\153', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\111', '\161', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\146', '\116', '\040', '\167', '\141', '\040', '\061', - '\012', '\126', '\150', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\104', '\147', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\153', '\121', '\040', '\153', '\141', '\040', '\061', - '\012', '\127', '\170', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\111', '\143', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\131', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\161', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\166', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\163', '\170', '\125', '\040', '\163', '\164', '\040', '\061', - '\012', '\114', '\161', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\146', '\111', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\171', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\166', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\123', '\144', '\166', '\040', '\144', '\145', '\040', '\061', - '\012', '\165', '\131', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\121', '\147', '\155', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\130', '\141', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\102', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\160', '\131', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\152', '\127', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\113', '\146', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\152', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\120', '\152', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\141', '\152', '\130', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\130', '\144', '\040', '\163', '\164', '\040', '\061', - '\012', '\170', '\110', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\150', '\101', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\107', '\155', '\040', '\145', '\162', '\040', '\061', - '\012', '\121', '\164', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\162', '\131', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\120', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\122', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\117', '\147', '\040', '\167', '\141', '\040', '\061', - '\012', '\146', '\114', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\121', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\150', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\103', '\167', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\127', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\112', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\120', '\170', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\156', '\160', '\111', '\040', '\141', '\156', '\040', '\061', - '\012', '\154', '\156', '\127', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\161', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\167', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\103', '\144', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\146', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\160', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\115', '\142', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\156', '\167', '\116', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\114', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\127', '\143', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\126', '\166', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\126', '\153', '\170', '\040', '\153', '\141', '\040', '\061', - '\012', '\144', '\155', '\125', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\107', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\147', '\112', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\106', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\103', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\166', '\127', '\040', '\154', '\145', '\040', '\061', - '\012', '\123', '\166', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\112', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\165', '\132', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\124', '\152', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\111', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\126', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\144', '\117', '\040', '\144', '\145', '\040', '\061', - '\012', '\154', '\124', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\115', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\104', '\155', '\040', '\141', '\156', '\040', '\061', - '\012', '\124', '\172', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\160', '\103', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\121', '\153', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\160', '\131', '\040', '\160', '\162', '\040', '\061', - '\012', '\171', '\121', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\151', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\121', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\167', '\125', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\126', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\164', '\152', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\130', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\130', '\146', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\143', '\147', '\111', '\040', '\143', '\150', '\040', '\061', - '\012', '\120', '\153', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\152', '\106', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\162', '\112', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\167', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\164', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\110', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\110', '\147', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\104', '\172', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\142', '\105', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\146', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\122', '\152', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\155', '\131', '\040', '\155', '\145', '\040', '\061', - '\012', '\167', '\131', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\165', '\106', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\127', '\155', '\040', '\166', '\141', '\040', '\061', - '\012', '\171', '\126', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\147', '\114', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\155', '\122', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\146', '\102', '\040', '\163', '\172', '\040', '\061', - '\012', '\172', '\156', '\110', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\147', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\165', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\102', '\163', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\157', '\127', '\170', '\040', '\157', '\156', '\040', '\061', - '\012', '\120', '\152', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\112', '\144', '\146', '\040', '\144', '\145', '\040', '\061', - '\012', '\130', '\155', '\160', '\040', '\155', '\145', '\040', '\061', - '\012', '\163', '\147', '\117', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\103', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\164', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\104', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\142', '\121', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\161', '\165', '\115', '\040', '\165', '\156', '\040', '\061', - '\012', '\146', '\114', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\116', '\150', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\156', '\125', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\144', '\123', '\040', '\163', '\164', '\040', '\061', - '\012', '\167', '\127', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\106', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\106', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\127', '\167', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\114', '\161', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\161', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\155', '\104', '\040', '\163', '\172', '\040', '\061', - '\012', '\107', '\171', '\170', '\040', '\156', '\171', '\040', '\061', - '\012', '\142', '\153', '\122', '\040', '\153', '\141', '\040', '\061', - '\012', '\154', '\121', '\167', '\040', '\154', '\145', '\040', '\061', - '\012', '\120', '\161', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\106', '\167', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\164', '\110', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\171', '\114', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\170', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\162', '\103', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\172', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\112', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\146', '\123', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\115', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\154', '\126', '\040', '\154', '\145', '\040', '\061', - '\012', '\142', '\153', '\112', '\040', '\153', '\141', '\040', '\061', - '\012', '\153', '\156', '\110', '\040', '\141', '\156', '\040', '\061', - '\012', '\125', '\161', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\165', '\106', '\040', '\143', '\150', '\040', '\061', - '\012', '\151', '\131', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\125', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\163', '\102', '\142', '\040', '\163', '\164', '\040', '\061', - '\012', '\116', '\150', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\150', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\127', '\160', '\040', '\144', '\145', '\040', '\061', - '\012', '\131', '\166', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\122', '\170', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\153', '\172', '\107', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\165', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\166', '\104', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\167', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\152', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\132', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\112', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\156', '\117', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\143', '\101', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\146', '\113', '\040', '\155', '\145', '\040', '\061', - '\012', '\166', '\152', '\123', '\040', '\151', '\152', '\040', '\061', - '\012', '\116', '\166', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\144', '\146', '\102', '\040', '\144', '\145', '\040', '\061', - '\012', '\121', '\163', '\142', '\040', '\163', '\164', '\040', '\061', - '\012', '\144', '\130', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\172', '\122', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\105', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\141', '\107', '\172', '\040', '\141', '\156', '\040', '\061', - '\012', '\156', '\110', '\147', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\166', '\101', '\040', '\166', '\141', '\040', '\061', - '\012', '\102', '\146', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\126', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\163', '\131', '\040', '\163', '\164', '\040', '\061', - '\012', '\150', '\126', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\120', '\152', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\163', '\130', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\151', '\113', '\152', '\040', '\151', '\156', '\040', '\061', - '\012', '\161', '\141', '\105', '\040', '\141', '\156', '\040', '\061', - '\012', '\103', '\146', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\115', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\147', '\132', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\147', '\101', '\040', '\156', '\147', '\040', '\061', - '\012', '\151', '\167', '\112', '\040', '\151', '\156', '\040', '\061', - '\012', '\166', '\107', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\164', '\146', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\152', '\110', '\040', '\154', '\145', '\040', '\061', - '\012', '\172', '\107', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\155', '\113', '\040', '\155', '\145', '\040', '\061', - '\012', '\156', '\125', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\122', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\107', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\126', '\144', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\123', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\116', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\124', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\156', '\161', '\105', '\040', '\141', '\156', '\040', '\061', - '\012', '\127', '\156', '\147', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\126', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\126', '\163', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\116', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\116', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\156', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\112', '\163', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\166', '\112', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\154', '\115', '\040', '\154', '\145', '\040', '\061', - '\012', '\112', '\172', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\122', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\143', '\113', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\126', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\162', '\127', '\167', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\110', '\153', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\117', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\151', '\125', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\156', '\127', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\161', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\106', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\156', '\103', '\147', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\131', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\126', '\163', '\170', '\040', '\163', '\164', '\040', '\061', - '\012', '\155', '\164', '\115', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\150', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\164', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\143', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\116', '\167', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\144', '\130', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\112', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\163', '\117', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\122', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\122', '\156', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\155', '\120', '\040', '\153', '\141', '\040', '\061', - '\012', '\130', '\164', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\107', '\166', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\161', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\126', '\154', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\144', '\111', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\144', '\105', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\132', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\102', '\144', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\150', '\110', '\156', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\153', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\170', '\112', '\040', '\166', '\141', '\040', '\061', - '\012', '\154', '\162', '\101', '\040', '\145', '\162', '\040', '\061', - '\012', '\154', '\162', '\124', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\152', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\142', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\124', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\155', '\126', '\040', '\155', '\145', '\040', '\061', - '\012', '\162', '\104', '\153', '\040', '\145', '\162', '\040', '\061', - '\012', '\144', '\116', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\107', '\172', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\141', '\126', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\116', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\153', '\130', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\162', '\107', '\163', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\141', '\130', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\162', '\107', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\112', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\104', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\115', '\146', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\170', '\105', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\121', '\166', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\122', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\106', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\103', '\160', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\162', '\112', '\153', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\142', '\121', '\040', '\142', '\145', '\040', '\061', - '\012', '\130', '\172', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\106', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\146', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\164', '\167', '\105', '\040', '\164', '\150', '\040', '\061', - '\012', '\117', '\141', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\163', '\131', '\040', '\163', '\164', '\040', '\061', - '\012', '\167', '\144', '\132', '\040', '\144', '\145', '\040', '\061', - '\012', '\147', '\155', '\117', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\107', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\122', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\147', '\161', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\101', '\147', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\124', '\167', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\121', '\156', '\166', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\126', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\143', '\104', '\167', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\107', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\142', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\124', '\166', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\155', '\116', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\144', '\164', '\105', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\172', '\120', '\040', '\163', '\172', '\040', '\061', - '\012', '\126', '\163', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\107', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\120', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\171', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\170', '\106', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\104', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\110', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\170', '\132', '\040', '\146', '\157', '\040', '\061', - '\012', '\163', '\121', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\156', '\155', '\110', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\162', '\104', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\115', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\110', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\150', '\155', '\123', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\144', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\167', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\165', '\112', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\120', '\153', '\040', '\163', '\164', '\040', '\061', - '\012', '\130', '\152', '\160', '\040', '\151', '\152', '\040', '\061', - '\012', '\125', '\161', '\151', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\147', '\104', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\147', '\111', '\040', '\156', '\147', '\040', '\061', - '\012', '\165', '\106', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\116', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\150', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\114', '\170', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\123', '\146', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\122', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\167', '\113', '\040', '\167', '\141', '\040', '\061', - '\012', '\146', '\155', '\102', '\040', '\155', '\145', '\040', '\061', - '\012', '\166', '\162', '\126', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\123', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\120', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\110', '\142', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\142', '\112', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\161', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\123', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\115', '\153', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\126', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\153', '\113', '\040', '\153', '\141', '\040', '\061', - '\012', '\130', '\144', '\163', '\040', '\144', '\145', '\040', '\061', - '\012', '\171', '\142', '\102', '\040', '\142', '\145', '\040', '\061', - '\012', '\147', '\160', '\105', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\143', '\103', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\170', '\114', '\040', '\160', '\162', '\040', '\061', - '\012', '\147', '\120', '\155', '\040', '\156', '\147', '\040', '\061', - '\012', '\102', '\160', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\160', '\102', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\154', '\112', '\040', '\154', '\145', '\040', '\061', - '\012', '\160', '\153', '\103', '\040', '\153', '\141', '\040', '\061', - '\012', '\171', '\160', '\120', '\040', '\160', '\162', '\040', '\061', - '\012', '\116', '\161', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\147', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\105', '\161', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\122', '\153', '\040', '\144', '\145', '\040', '\061', - '\012', '\125', '\142', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\150', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\112', '\144', '\040', '\154', '\145', '\040', '\061', - '\012', '\160', '\166', '\116', '\040', '\166', '\141', '\040', '\061', - '\012', '\121', '\146', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\104', '\142', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\163', '\106', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\153', '\130', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\160', '\122', '\040', '\160', '\162', '\040', '\061', - '\012', '\160', '\152', '\112', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\153', '\121', '\040', '\156', '\147', '\040', '\061', - '\012', '\162', '\115', '\146', '\040', '\145', '\162', '\040', '\061', - '\012', '\112', '\163', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\117', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\104', '\161', '\165', '\040', '\165', '\156', '\040', '\061', - '\012', '\156', '\142', '\112', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\166', '\106', '\040', '\156', '\147', '\040', '\061', - '\012', '\106', '\156', '\160', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\160', '\126', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\164', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\105', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\150', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\117', '\150', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\130', '\171', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\144', '\125', '\040', '\144', '\145', '\040', '\061', - '\012', '\155', '\104', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\151', '\126', '\153', '\040', '\151', '\156', '\040', '\061', - '\012', '\110', '\161', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\160', '\132', '\040', '\160', '\157', '\040', '\061', - '\012', '\141', '\145', '\125', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\152', '\132', '\040', '\163', '\164', '\040', '\061', - '\012', '\163', '\107', '\160', '\040', '\163', '\164', '\040', '\061', - '\012', '\127', '\161', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\161', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\152', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\120', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\130', '\172', '\040', '\163', '\164', '\040', '\061', - '\012', '\170', '\166', '\120', '\040', '\166', '\141', '\040', '\061', - '\012', '\127', '\142', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\152', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\150', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\161', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\131', '\146', '\040', '\144', '\145', '\040', '\061', - '\012', '\160', '\106', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\163', '\106', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\110', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\150', '\101', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\154', '\105', '\040', '\154', '\145', '\040', '\061', - '\012', '\163', '\161', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\156', '\162', '\040', '\141', '\156', '\040', '\061', - '\012', '\106', '\170', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\110', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\144', '\102', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\110', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\120', '\170', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\110', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\156', '\161', '\112', '\040', '\141', '\156', '\040', '\061', - '\012', '\157', '\161', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\142', '\171', '\040', '\142', '\145', '\040', '\061', - '\012', '\164', '\142', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\123', '\146', '\040', '\153', '\141', '\040', '\061', - '\012', '\166', '\150', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\110', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\116', '\160', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\121', '\172', '\160', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\151', '\125', '\040', '\151', '\156', '\040', '\061', - '\012', '\162', '\152', '\132', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\152', '\125', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\164', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\131', '\147', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\141', '\121', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\127', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\141', '\126', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\121', '\170', '\040', '\160', '\162', '\040', '\061', - '\012', '\114', '\156', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\127', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\165', '\110', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\166', '\160', '\040', '\166', '\141', '\040', '\061', - '\012', '\112', '\170', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\172', '\110', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\166', '\125', '\040', '\166', '\141', '\040', '\061', - '\012', '\127', '\161', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\126', '\163', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\147', '\171', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\132', '\152', '\040', '\144', '\145', '\040', '\061', - '\012', '\165', '\103', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\170', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\110', '\154', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\127', '\161', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\104', '\170', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\144', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\166', '\115', '\040', '\166', '\141', '\040', '\061', - '\012', '\127', '\170', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\127', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\151', '\117', '\040', '\151', '\156', '\040', '\061', - '\012', '\146', '\104', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\142', '\110', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\151', '\126', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\120', '\155', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\130', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\146', '\114', '\040', '\146', '\157', '\040', '\061', - '\012', '\171', '\107', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\102', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\103', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\114', '\154', '\153', '\040', '\154', '\145', '\040', '\061', - '\012', '\171', '\115', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\162', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\144', '\130', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\170', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\155', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\122', '\172', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\156', '\102', '\144', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\127', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\165', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\171', '\106', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\126', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\147', '\120', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\106', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\106', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\122', '\155', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\153', '\154', '\110', '\040', '\154', '\145', '\040', '\061', - '\012', '\126', '\146', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\113', '\172', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\114', '\150', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\123', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\121', '\162', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\102', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\103', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\171', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\130', '\165', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\146', '\115', '\040', '\167', '\141', '\040', '\061', - '\012', '\153', '\144', '\113', '\040', '\144', '\145', '\040', '\061', - '\012', '\143', '\130', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\164', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\152', '\111', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\147', '\123', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\167', '\114', '\040', '\155', '\145', '\040', '\061', - '\012', '\153', '\172', '\125', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\132', '\162', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\161', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\112', '\151', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\104', '\144', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\113', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\141', '\125', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\170', '\105', '\040', '\163', '\164', '\040', '\061', - '\012', '\155', '\170', '\125', '\040', '\155', '\145', '\040', '\061', - '\012', '\143', '\167', '\131', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\160', '\103', '\040', '\160', '\162', '\040', '\061', - '\012', '\163', '\122', '\167', '\040', '\163', '\164', '\040', '\061', - '\012', '\113', '\153', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\170', '\101', '\040', '\167', '\141', '\040', '\061', - '\012', '\147', '\121', '\146', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\120', '\142', '\040', '\160', '\162', '\040', '\061', - '\012', '\110', '\167', '\165', '\040', '\153', '\165', '\040', '\061', - '\012', '\163', '\165', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\161', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\170', '\127', '\040', '\163', '\164', '\040', '\061', - '\012', '\141', '\106', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\127', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\142', '\132', '\040', '\160', '\162', '\040', '\061', - '\012', '\142', '\161', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\112', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\164', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\115', '\144', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\107', '\163', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\154', '\110', '\040', '\154', '\145', '\040', '\061', - '\012', '\144', '\155', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\162', '\153', '\040', '\145', '\162', '\040', '\061', - '\012', '\117', '\143', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\113', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\162', '\101', '\040', '\145', '\162', '\040', '\061', - '\012', '\147', '\170', '\105', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\127', '\165', '\040', '\165', '\156', '\040', '\061', - '\012', '\170', '\121', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\130', '\157', '\172', '\040', '\157', '\156', '\040', '\061', - '\012', '\146', '\155', '\120', '\040', '\155', '\145', '\040', '\061', - '\012', '\153', '\144', '\104', '\040', '\144', '\145', '\040', '\061', - '\012', '\142', '\102', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\160', '\101', '\040', '\160', '\162', '\040', '\061', - '\012', '\156', '\115', '\142', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\110', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\115', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\123', '\166', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\115', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\102', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\155', '\130', '\040', '\155', '\145', '\040', '\061', - '\012', '\150', '\143', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\162', '\125', '\040', '\145', '\162', '\040', '\061', - '\012', '\160', '\141', '\130', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\144', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\167', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\163', '\142', '\131', '\040', '\163', '\164', '\040', '\061', - '\012', '\155', '\150', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\146', '\132', '\040', '\160', '\162', '\040', '\061', - '\012', '\126', '\155', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\103', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\132', '\146', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\114', '\152', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\161', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\160', '\113', '\040', '\144', '\145', '\040', '\061', - '\012', '\164', '\146', '\107', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\152', '\122', '\040', '\151', '\156', '\040', '\061', - '\012', '\151', '\112', '\171', '\040', '\151', '\156', '\040', '\061', - '\012', '\161', '\146', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\162', '\123', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\147', '\124', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\117', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\156', '\105', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\127', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\160', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\167', '\144', '\117', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\131', '\171', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\162', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\155', '\106', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\150', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\110', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\112', '\172', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\105', '\171', '\040', '\156', '\171', '\040', '\061', - '\012', '\150', '\150', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\160', '\121', '\040', '\160', '\162', '\040', '\061', - '\012', '\161', '\131', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\164', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\113', '\144', '\170', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\146', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\142', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\142', '\142', '\117', '\040', '\142', '\145', '\040', '\061', - '\012', '\130', '\143', '\156', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\103', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\107', '\143', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\155', '\103', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\112', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\104', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\112', '\172', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\131', '\162', '\167', '\040', '\145', '\162', '\040', '\061', - '\012', '\113', '\163', '\170', '\040', '\163', '\164', '\040', '\061', - '\012', '\165', '\113', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\123', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\114', '\152', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\144', '\102', '\040', '\144', '\145', '\040', '\061', - '\012', '\172', '\127', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\167', '\131', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\115', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\142', '\110', '\040', '\144', '\145', '\040', '\061', - '\012', '\121', '\163', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\110', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\112', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\132', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\142', '\164', '\117', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\155', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\161', '\160', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\156', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\154', '\104', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\143', '\130', '\040', '\143', '\150', '\040', '\061', - '\012', '\131', '\166', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\132', '\146', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\161', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\161', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\110', '\164', '\150', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\164', '\114', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\117', '\152', '\040', '\151', '\156', '\040', '\061', - '\012', '\143', '\111', '\172', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\150', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\166', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\147', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\152', '\103', '\040', '\151', '\152', '\040', '\061', - '\012', '\117', '\152', '\160', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\166', '\111', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\161', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\161', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\151', '\110', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\170', '\112', '\040', '\151', '\152', '\040', '\061', - '\012', '\107', '\142', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\156', '\121', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\130', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\104', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\121', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\112', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\172', '\142', '\131', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\122', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\105', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\141', '\132', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\152', '\106', '\040', '\151', '\152', '\040', '\061', - '\012', '\154', '\161', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\123', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\142', '\130', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\112', '\166', '\040', '\151', '\152', '\040', '\061', - '\012', '\127', '\162', '\166', '\040', '\145', '\162', '\040', '\061', - '\012', '\113', '\160', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\170', '\141', '\131', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\103', '\166', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\142', '\122', '\040', '\142', '\145', '\040', '\061', - '\012', '\160', '\124', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\167', '\144', '\111', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\146', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\122', '\162', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\142', '\106', '\040', '\144', '\145', '\040', '\061', - '\012', '\142', '\172', '\106', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\167', '\117', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\162', '\131', '\040', '\145', '\162', '\040', '\061', - '\012', '\164', '\167', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\114', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\126', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\156', '\154', '\040', '\141', '\156', '\040', '\061', - '\012', '\127', '\147', '\142', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\165', '\123', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\111', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\124', '\167', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\113', '\144', '\040', '\141', '\156', '\040', '\061', - '\012', '\104', '\153', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\102', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\117', '\172', '\040', '\153', '\141', '\040', '\061', - '\012', '\172', '\117', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\156', '\172', '\105', '\040', '\141', '\156', '\040', '\061', - '\012', '\132', '\142', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\115', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\146', '\103', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\147', '\104', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\164', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\161', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\113', '\152', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\142', '\130', '\040', '\142', '\145', '\040', '\061', - '\012', '\172', '\146', '\110', '\040', '\163', '\172', '\040', '\061', - '\012', '\155', '\167', '\110', '\040', '\155', '\145', '\040', '\061', - '\012', '\172', '\121', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\107', '\172', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\163', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\116', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\114', '\161', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\155', '\127', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\116', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\143', '\121', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\115', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\107', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\165', '\103', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\102', '\160', '\166', '\040', '\160', '\162', '\040', '\061', - '\012', '\161', '\116', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\160', '\120', '\040', '\160', '\162', '\040', '\061', - '\012', '\154', '\130', '\146', '\040', '\154', '\145', '\040', '\061', - '\012', '\143', '\114', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\144', '\130', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\172', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\113', '\170', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\166', '\106', '\040', '\151', '\152', '\040', '\061', - '\012', '\162', '\106', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\105', '\164', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\131', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\113', '\163', '\166', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\112', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\146', '\153', '\103', '\040', '\153', '\141', '\040', '\061', - '\012', '\155', '\170', '\113', '\040', '\155', '\145', '\040', '\061', - '\012', '\146', '\142', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\162', '\127', '\040', '\145', '\162', '\040', '\061', - '\012', '\155', '\120', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\102', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\103', '\146', '\040', '\151', '\156', '\040', '\061', - '\012', '\163', '\162', '\110', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\152', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\143', '\107', '\040', '\143', '\150', '\040', '\061', - '\012', '\106', '\164', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\102', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\161', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\152', '\106', '\040', '\144', '\145', '\040', '\061', - '\012', '\164', '\147', '\125', '\040', '\164', '\150', '\040', '\061', - '\012', '\127', '\162', '\152', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\106', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\143', '\103', '\040', '\143', '\150', '\040', '\061', - '\012', '\145', '\161', '\101', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\142', '\107', '\040', '\160', '\162', '\040', '\061', - '\012', '\103', '\167', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\104', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\167', '\124', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\162', '\127', '\040', '\145', '\162', '\040', '\061', - '\012', '\153', '\121', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\167', '\115', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\171', '\103', '\156', '\040', '\156', '\144', '\040', '\061', - '\012', '\145', '\107', '\160', '\040', '\145', '\162', '\040', '\061', - '\012', '\165', '\120', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\161', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\151', '\111', '\040', '\151', '\156', '\040', '\061', - '\012', '\162', '\161', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\113', '\152', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\154', '\167', '\113', '\040', '\154', '\145', '\040', '\061', - '\012', '\146', '\152', '\121', '\040', '\151', '\152', '\040', '\061', - '\012', '\165', '\111', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\170', '\122', '\040', '\144', '\145', '\040', '\061', - '\012', '\107', '\161', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\114', '\142', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\122', '\144', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\171', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\164', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\122', '\153', '\040', '\143', '\150', '\040', '\061', - '\012', '\151', '\113', '\146', '\040', '\151', '\156', '\040', '\061', - '\012', '\150', '\142', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\161', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\155', '\106', '\040', '\155', '\145', '\040', '\061', - '\012', '\166', '\110', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\161', '\116', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\114', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\166', '\112', '\040', '\166', '\141', '\040', '\061', - '\012', '\142', '\147', '\112', '\040', '\156', '\147', '\040', '\061', - '\012', '\121', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\166', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\110', '\170', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\126', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\150', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\154', '\114', '\040', '\154', '\145', '\040', '\061', - '\012', '\153', '\144', '\110', '\040', '\144', '\145', '\040', '\061', - '\012', '\113', '\146', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\104', '\146', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\103', '\161', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\121', '\153', '\040', '\141', '\156', '\040', '\061', - '\012', '\127', '\156', '\172', '\040', '\141', '\156', '\040', '\061', - '\012', '\116', '\152', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\112', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\167', '\122', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\104', '\160', '\142', '\040', '\160', '\162', '\040', '\061', - '\012', '\163', '\120', '\152', '\040', '\163', '\164', '\040', '\061', - '\012', '\132', '\160', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\120', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\121', '\143', '\154', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\103', '\144', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\162', '\103', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\103', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\141', '\102', '\166', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\165', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\143', '\116', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\132', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\107', '\164', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\142', '\127', '\040', '\167', '\141', '\040', '\061', - '\012', '\166', '\120', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\164', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\127', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\142', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\127', '\155', '\142', '\040', '\155', '\145', '\040', '\061', - '\012', '\160', '\170', '\131', '\040', '\160', '\162', '\040', '\061', - '\012', '\150', '\121', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\116', '\156', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\144', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\131', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\154', '\130', '\040', '\154', '\145', '\040', '\061', - '\012', '\162', '\167', '\106', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\132', '\155', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\142', '\112', '\040', '\142', '\145', '\040', '\061', - '\012', '\161', '\141', '\102', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\126', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\125', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\146', '\103', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\170', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\124', '\142', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\157', '\106', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\124', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\150', '\102', '\153', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\121', '\145', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\102', '\145', '\040', '\144', '\145', '\040', '\061', - '\012', '\144', '\160', '\103', '\040', '\144', '\145', '\040', '\061', - '\012', '\153', '\160', '\127', '\040', '\153', '\141', '\040', '\061', - '\012', '\132', '\153', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\116', '\167', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\162', '\103', '\040', '\156', '\147', '\040', '\061', - '\012', '\165', '\130', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\125', '\157', '\171', '\040', '\157', '\156', '\040', '\061', - '\012', '\132', '\146', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\113', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\150', '\123', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\142', '\120', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\143', '\147', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\111', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\102', '\166', '\040', '\156', '\147', '\040', '\061', - '\012', '\147', '\132', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\120', '\165', '\040', '\165', '\156', '\040', '\061', - '\012', '\102', '\146', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\162', '\170', '\103', '\040', '\145', '\162', '\040', '\061', - '\012', '\163', '\114', '\153', '\040', '\163', '\164', '\040', '\061', - '\012', '\150', '\107', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\166', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\160', '\122', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\116', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\104', '\146', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\122', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\150', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\161', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\116', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\167', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\167', '\101', '\040', '\167', '\141', '\040', '\061', - '\012', '\167', '\115', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\123', '\156', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\146', '\104', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\107', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\130', '\161', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\113', '\167', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\121', '\150', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\117', '\171', '\170', '\040', '\156', '\171', '\040', '\061', - '\012', '\144', '\166', '\102', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\126', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\110', '\143', '\156', '\040', '\143', '\150', '\040', '\061', - '\012', '\163', '\142', '\125', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\106', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\153', '\146', '\124', '\040', '\153', '\141', '\040', '\061', - '\012', '\162', '\166', '\127', '\040', '\145', '\162', '\040', '\061', - '\012', '\131', '\170', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\156', '\106', '\153', '\040', '\141', '\156', '\040', '\061', - '\012', '\114', '\161', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\157', '\121', '\040', '\164', '\150', '\040', '\061', - '\012', '\116', '\146', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\162', '\110', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\112', '\153', '\040', '\143', '\150', '\040', '\061', - '\012', '\120', '\156', '\166', '\040', '\141', '\156', '\040', '\061', - '\012', '\116', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\146', '\105', '\040', '\156', '\171', '\040', '\061', - '\012', '\153', '\155', '\111', '\040', '\153', '\141', '\040', '\061', - '\012', '\107', '\155', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\170', '\123', '\040', '\142', '\145', '\040', '\061', - '\012', '\161', '\165', '\125', '\040', '\165', '\156', '\040', '\061', - '\012', '\161', '\131', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\113', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\150', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\157', '\146', '\131', '\040', '\157', '\156', '\040', '\061', - '\012', '\160', '\162', '\110', '\040', '\145', '\162', '\040', '\061', - '\012', '\152', '\130', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\121', '\155', '\040', '\166', '\141', '\040', '\061', - '\012', '\151', '\127', '\170', '\040', '\151', '\156', '\040', '\061', - '\012', '\142', '\172', '\103', '\040', '\163', '\172', '\040', '\061', - '\012', '\156', '\131', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\141', '\113', '\040', '\141', '\156', '\040', '\061', - '\012', '\107', '\147', '\142', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\123', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\162', '\121', '\172', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\153', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\126', '\156', '\154', '\040', '\141', '\156', '\040', '\061', - '\012', '\107', '\164', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\115', '\167', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\166', '\130', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\171', '\125', '\040', '\151', '\152', '\040', '\061', - '\012', '\121', '\161', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\110', '\156', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\106', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\161', '\153', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\127', '\143', '\153', '\040', '\143', '\150', '\040', '\061', - '\012', '\146', '\115', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\172', '\147', '\105', '\040', '\156', '\147', '\040', '\061', - '\012', '\157', '\112', '\172', '\040', '\157', '\156', '\040', '\061', - '\012', '\170', '\166', '\110', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\121', '\171', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\131', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\170', '\104', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\104', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\102', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\112', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\120', '\152', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\127', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\162', '\110', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\151', '\171', '\115', '\040', '\151', '\156', '\040', '\061', - '\012', '\171', '\170', '\104', '\040', '\156', '\171', '\040', '\061', - '\012', '\153', '\120', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\130', '\166', '\040', '\143', '\150', '\040', '\061', - '\012', '\116', '\155', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\153', '\116', '\040', '\153', '\141', '\040', '\061', - '\012', '\154', '\106', '\152', '\040', '\154', '\145', '\040', '\061', - '\012', '\171', '\155', '\125', '\040', '\155', '\145', '\040', '\061', - '\012', '\160', '\132', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\132', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\161', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\101', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\102', '\143', '\171', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\161', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\161', '\105', '\040', '\143', '\150', '\040', '\061', - '\012', '\122', '\167', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\143', '\162', '\115', '\040', '\143', '\150', '\040', '\061', - '\012', '\101', '\170', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\132', '\152', '\160', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\170', '\106', '\040', '\156', '\171', '\040', '\061', - '\012', '\166', '\132', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\120', '\142', '\040', '\163', '\164', '\040', '\061', - '\012', '\166', '\103', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\121', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\131', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\102', '\160', '\040', '\164', '\150', '\040', '\061', - '\012', '\112', '\142', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\147', '\161', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\162', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\103', '\146', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\155', '\142', '\112', '\040', '\155', '\145', '\040', '\061', - '\012', '\146', '\122', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\111', '\167', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\165', '\106', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\131', '\172', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\104', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\110', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\155', '\111', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\143', '\105', '\040', '\143', '\150', '\040', '\061', - '\012', '\115', '\150', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\165', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\130', '\146', '\040', '\156', '\147', '\040', '\061', - '\012', '\154', '\120', '\171', '\040', '\154', '\145', '\040', '\061', - '\012', '\142', '\120', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\130', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\117', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\116', '\155', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\104', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\103', '\167', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\154', '\152', '\120', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\161', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\162', '\105', '\040', '\141', '\156', '\040', '\061', - '\012', '\113', '\155', '\167', '\040', '\155', '\145', '\040', '\061', - '\012', '\147', '\112', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\147', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\172', '\122', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\112', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\141', '\125', '\151', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\156', '\131', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\132', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\106', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\123', '\170', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\101', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\151', '\132', '\166', '\040', '\151', '\156', '\040', '\061', - '\012', '\152', '\130', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\160', '\122', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\126', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\144', '\116', '\152', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\102', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\115', '\152', '\171', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\152', '\132', '\040', '\151', '\152', '\040', '\061', - '\012', '\164', '\114', '\163', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\131', '\152', '\040', '\151', '\156', '\040', '\061', - '\012', '\167', '\142', '\117', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\130', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\112', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\113', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\152', '\117', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\165', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\154', '\121', '\040', '\154', '\145', '\040', '\061', - '\012', '\171', '\146', '\102', '\040', '\156', '\171', '\040', '\061', - '\012', '\121', '\163', '\153', '\040', '\163', '\164', '\040', '\061', - '\012', '\125', '\167', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\132', '\161', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\155', '\131', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\130', '\167', '\040', '\160', '\162', '\040', '\061', - '\012', '\171', '\126', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\111', '\167', '\040', '\156', '\147', '\040', '\061', - '\012', '\110', '\170', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\120', '\147', '\171', '\040', '\156', '\147', '\040', '\061', - '\012', '\154', '\121', '\166', '\040', '\154', '\145', '\040', '\061', - '\012', '\142', '\156', '\113', '\040', '\141', '\156', '\040', '\061', - '\012', '\170', '\164', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\143', '\145', '\040', '\143', '\150', '\040', '\061', - '\012', '\116', '\152', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\166', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\115', '\167', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\107', '\164', '\156', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\112', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\112', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\104', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\114', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\157', '\145', '\125', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\166', '\131', '\040', '\143', '\150', '\040', '\061', - '\012', '\107', '\142', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\124', '\161', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\141', '\124', '\160', '\040', '\141', '\156', '\040', '\061', - '\012', '\131', '\167', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\144', '\124', '\040', '\144', '\145', '\040', '\061', - '\012', '\127', '\153', '\155', '\040', '\153', '\141', '\040', '\061', - '\012', '\160', '\170', '\101', '\040', '\160', '\162', '\040', '\061', - '\012', '\166', '\104', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\163', '\146', '\104', '\040', '\163', '\164', '\040', '\061', - '\012', '\162', '\161', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\110', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\151', '\126', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\115', '\146', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\126', '\155', '\040', '\163', '\164', '\040', '\061', - '\012', '\156', '\172', '\122', '\040', '\141', '\156', '\040', '\061', - '\012', '\121', '\166', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\153', '\132', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\127', '\156', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\132', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\166', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\120', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\123', '\170', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\116', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\162', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\114', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\126', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\105', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\161', '\103', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\132', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\150', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\116', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\106', '\152', '\040', '\145', '\162', '\040', '\061', - '\012', '\170', '\120', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\161', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\120', '\152', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\131', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\106', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\166', '\114', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\154', '\161', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\112', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\154', '\126', '\172', '\040', '\154', '\145', '\040', '\061', - '\012', '\143', '\132', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\143', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\150', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\114', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\171', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\150', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\164', '\113', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\122', '\142', '\040', '\160', '\162', '\040', '\061', - '\012', '\142', '\103', '\170', '\040', '\142', '\145', '\040', '\061', - '\012', '\156', '\112', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\152', '\167', '\106', '\040', '\151', '\152', '\040', '\061', - '\012', '\120', '\144', '\152', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\170', '\105', '\040', '\151', '\152', '\040', '\061', - '\012', '\163', '\154', '\132', '\040', '\154', '\145', '\040', '\061', - '\012', '\114', '\170', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\156', '\114', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\172', '\126', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\107', '\161', '\040', '\154', '\145', '\040', '\061', - '\012', '\121', '\142', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\152', '\142', '\131', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\123', '\155', '\040', '\163', '\172', '\040', '\061', - '\012', '\121', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\160', '\122', '\040', '\160', '\162', '\040', '\061', - '\012', '\147', '\103', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\131', '\166', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\151', '\150', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\146', '\170', '\040', '\146', '\157', '\040', '\061', - '\012', '\156', '\152', '\111', '\040', '\156', '\144', '\040', '\061', - '\012', '\131', '\160', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\154', '\170', '\124', '\040', '\154', '\145', '\040', '\061', - '\012', '\146', '\126', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\112', '\172', '\155', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\170', '\101', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\104', '\154', '\040', '\156', '\147', '\040', '\061', - '\012', '\105', '\141', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\121', '\143', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\107', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\114', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\153', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\142', '\113', '\040', '\167', '\141', '\040', '\061', - '\012', '\156', '\116', '\170', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\161', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\122', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\170', '\162', '\125', '\040', '\145', '\162', '\040', '\061', - '\012', '\146', '\156', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\172', '\102', '\040', '\163', '\172', '\040', '\061', - '\012', '\122', '\143', '\156', '\040', '\143', '\150', '\040', '\061', - '\012', '\161', '\142', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\162', '\104', '\040', '\145', '\162', '\040', '\061', - '\012', '\126', '\170', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\166', '\106', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\112', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\131', '\170', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\151', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\115', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\142', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\147', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\155', '\123', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\124', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\132', '\152', '\155', '\040', '\151', '\152', '\040', '\061', - '\012', '\116', '\152', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\144', '\161', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\131', '\152', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\113', '\167', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\170', '\125', '\040', '\143', '\150', '\040', '\061', - '\012', '\103', '\153', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\146', '\112', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\164', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\162', '\120', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\105', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\170', '\117', '\040', '\145', '\162', '\040', '\061', - '\012', '\162', '\132', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\142', '\132', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\130', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\166', '\104', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\143', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\153', '\117', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\116', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\106', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\130', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\126', '\153', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\107', '\152', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\121', '\143', '\144', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\166', '\106', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\106', '\170', '\040', '\170', '\145', '\040', '\061', - '\012', '\144', '\123', '\152', '\040', '\144', '\145', '\040', '\061', - '\012', '\170', '\120', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\157', '\106', '\160', '\040', '\157', '\156', '\040', '\061', - '\012', '\161', '\101', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\161', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\107', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\172', '\103', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\111', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\114', '\150', '\154', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\167', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\160', '\147', '\105', '\040', '\156', '\147', '\040', '\061', - '\012', '\101', '\167', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\102', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\113', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\120', '\146', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\165', '\161', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\112', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\124', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\164', '\127', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\144', '\116', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\162', '\116', '\040', '\145', '\162', '\040', '\061', - '\012', '\153', '\154', '\123', '\040', '\154', '\145', '\040', '\061', - '\012', '\161', '\105', '\151', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\106', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\161', '\122', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\156', '\155', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\130', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\170', '\116', '\040', '\146', '\157', '\040', '\061', - '\012', '\142', '\166', '\114', '\040', '\166', '\141', '\040', '\061', - '\012', '\157', '\107', '\146', '\040', '\157', '\156', '\040', '\061', - '\012', '\150', '\132', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\146', '\110', '\040', '\156', '\171', '\040', '\061', - '\012', '\144', '\143', '\105', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\147', '\127', '\040', '\156', '\147', '\040', '\061', - '\012', '\167', '\162', '\102', '\040', '\145', '\162', '\040', '\061', - '\012', '\153', '\127', '\155', '\040', '\153', '\141', '\040', '\061', - '\012', '\123', '\150', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\167', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\166', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\121', '\147', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\112', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\116', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\110', '\160', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\154', '\106', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\161', '\172', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\147', '\107', '\040', '\156', '\147', '\040', '\061', - '\012', '\153', '\144', '\132', '\040', '\144', '\145', '\040', '\061', - '\012', '\145', '\152', '\130', '\040', '\145', '\162', '\040', '\061', - '\012', '\120', '\170', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\166', '\124', '\040', '\166', '\141', '\040', '\061', - '\012', '\113', '\161', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\155', '\142', '\040', '\155', '\145', '\040', '\061', - '\012', '\170', '\106', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\167', '\121', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\120', '\147', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\160', '\114', '\040', '\160', '\162', '\040', '\061', - '\012', '\142', '\167', '\105', '\040', '\167', '\141', '\040', '\061', - '\012', '\170', '\110', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\126', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\155', '\106', '\040', '\151', '\152', '\040', '\061', - '\012', '\111', '\170', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\171', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\126', '\166', '\040', '\145', '\162', '\040', '\061', - '\012', '\131', '\164', '\167', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\160', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\160', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\152', '\130', '\040', '\163', '\172', '\040', '\061', - '\012', '\113', '\150', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\146', '\126', '\040', '\161', '\165', '\040', '\061', - '\012', '\112', '\172', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\153', '\124', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\102', '\172', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\152', '\122', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\147', '\127', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\155', '\111', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\103', '\142', '\040', '\153', '\141', '\040', '\061', - '\012', '\160', '\131', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\166', '\153', '\132', '\040', '\153', '\141', '\040', '\061', - '\012', '\167', '\166', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\126', '\146', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\154', '\132', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\116', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\103', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\142', '\126', '\040', '\153', '\141', '\040', '\061', - '\012', '\104', '\161', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\162', '\104', '\040', '\145', '\162', '\040', '\061', - '\012', '\154', '\142', '\107', '\040', '\154', '\145', '\040', '\061', - '\012', '\170', '\150', '\106', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\170', '\132', '\040', '\153', '\141', '\040', '\061', - '\012', '\111', '\165', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\106', '\170', '\040', '\156', '\171', '\040', '\061', - '\012', '\161', '\126', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\143', '\107', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\127', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\141', '\102', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\171', '\112', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\143', '\172', '\114', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\111', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\125', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\160', '\132', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\164', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\170', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\144', '\131', '\166', '\040', '\144', '\145', '\040', '\061', - '\012', '\151', '\161', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\167', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\146', '\104', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\126', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\113', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\146', '\121', '\040', '\166', '\141', '\040', '\061', - '\012', '\150', '\166', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\144', '\131', '\040', '\144', '\145', '\040', '\061', - '\012', '\110', '\172', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\131', '\163', '\040', '\143', '\150', '\040', '\061', - '\012', '\106', '\164', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\160', '\125', '\040', '\144', '\145', '\040', '\061', - '\012', '\114', '\154', '\144', '\040', '\154', '\145', '\040', '\061', - '\012', '\107', '\161', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\144', '\122', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\130', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\163', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\116', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\121', '\152', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\126', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\112', '\155', '\170', '\040', '\155', '\145', '\040', '\061', - '\012', '\160', '\104', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\151', '\102', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\114', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\156', '\107', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\124', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\116', '\144', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\161', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\125', '\141', '\167', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\172', '\116', '\040', '\163', '\172', '\040', '\061', - '\012', '\147', '\116', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\152', '\115', '\040', '\151', '\152', '\040', '\061', - '\012', '\154', '\156', '\113', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\170', '\142', '\040', '\163', '\172', '\040', '\061', - '\012', '\153', '\143', '\123', '\040', '\143', '\150', '\040', '\061', - '\012', '\156', '\152', '\115', '\040', '\141', '\156', '\040', '\061', - '\012', '\107', '\144', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\154', '\156', '\132', '\040', '\141', '\156', '\040', '\061', - '\012', '\131', '\147', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\150', '\113', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\160', '\124', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\161', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\151', '\152', '\130', '\040', '\151', '\156', '\040', '\061', - '\012', '\152', '\107', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\142', '\170', '\111', '\040', '\142', '\145', '\040', '\061', - '\012', '\166', '\130', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\126', '\162', '\167', '\040', '\145', '\162', '\040', '\061', - '\012', '\103', '\167', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\156', '\102', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\166', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\170', '\102', '\040', '\163', '\164', '\040', '\061', - '\012', '\155', '\126', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\103', '\172', '\170', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\171', '\126', '\040', '\156', '\171', '\040', '\061', - '\012', '\143', '\130', '\167', '\040', '\143', '\150', '\040', '\061', - '\012', '\121', '\156', '\146', '\040', '\141', '\156', '\040', '\061', - '\012', '\131', '\161', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\161', '\110', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\142', '\131', '\040', '\144', '\145', '\040', '\061', - '\012', '\123', '\161', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\113', '\161', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\160', '\112', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\142', '\115', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\106', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\113', '\142', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\162', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\112', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\156', '\122', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\146', '\161', '\116', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\146', '\101', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\157', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\117', '\167', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\156', '\154', '\107', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\111', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\161', '\162', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\116', '\167', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\161', '\141', '\127', '\040', '\141', '\156', '\040', '\061', - '\012', '\150', '\143', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\153', '\102', '\040', '\153', '\141', '\040', '\061', - '\012', '\116', '\144', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\113', '\172', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\170', '\102', '\040', '\156', '\147', '\040', '\061', - '\012', '\102', '\152', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\124', '\146', '\040', '\166', '\141', '\040', '\061', - '\012', '\152', '\106', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\115', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\165', '\146', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\160', '\107', '\040', '\141', '\156', '\040', '\061', - '\012', '\165', '\132', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\124', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\107', '\154', '\167', '\040', '\154', '\145', '\040', '\061', - '\012', '\113', '\161', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\103', '\170', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\152', '\132', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\123', '\161', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\171', '\120', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\145', '\121', '\152', '\040', '\145', '\162', '\040', '\061', - '\012', '\141', '\111', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\104', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\111', '\160', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\116', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\117', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\153', '\115', '\040', '\153', '\141', '\040', '\061', - '\012', '\166', '\106', '\171', '\040', '\166', '\141', '\040', '\061', - '\012', '\143', '\146', '\126', '\040', '\143', '\150', '\040', '\061', - '\012', '\113', '\152', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\153', '\120', '\040', '\156', '\147', '\040', '\061', - '\012', '\162', '\112', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\120', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\157', '\172', '\121', '\040', '\157', '\156', '\040', '\061', - '\012', '\104', '\154', '\153', '\040', '\154', '\145', '\040', '\061', - '\012', '\166', '\130', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\164', '\131', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\127', '\171', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\121', '\166', '\040', '\156', '\147', '\040', '\061', - '\012', '\131', '\167', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\124', '\160', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\121', '\150', '\143', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\165', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\156', '\142', '\123', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\121', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\147', '\132', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\125', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\165', '\127', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\115', '\146', '\040', '\155', '\145', '\040', '\061', - '\012', '\132', '\143', '\144', '\040', '\143', '\150', '\040', '\061', - '\012', '\151', '\102', '\160', '\040', '\151', '\156', '\040', '\061', - '\012', '\146', '\167', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\172', '\131', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\167', '\103', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\103', '\161', '\171', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\152', '\106', '\040', '\143', '\150', '\040', '\061', - '\012', '\107', '\146', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\155', '\143', '\127', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\161', '\126', '\040', '\143', '\150', '\040', '\061', - '\012', '\165', '\112', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\151', '\125', '\152', '\040', '\151', '\156', '\040', '\061', - '\012', '\166', '\153', '\122', '\040', '\153', '\141', '\040', '\061', - '\012', '\167', '\147', '\111', '\040', '\156', '\147', '\040', '\061', - '\012', '\166', '\125', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\127', '\144', '\156', '\040', '\144', '\145', '\040', '\061', - '\012', '\163', '\152', '\106', '\040', '\163', '\164', '\040', '\061', - '\012', '\164', '\120', '\166', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\122', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\154', '\126', '\040', '\154', '\145', '\040', '\061', - '\012', '\163', '\142', '\115', '\040', '\163', '\164', '\040', '\061', - '\012', '\155', '\146', '\124', '\040', '\155', '\145', '\040', '\061', - '\012', '\144', '\142', '\126', '\040', '\144', '\145', '\040', '\061', - '\012', '\106', '\155', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\147', '\146', '\125', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\142', '\102', '\040', '\143', '\150', '\040', '\061', - '\012', '\131', '\170', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\113', '\170', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\104', '\167', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\167', '\147', '\130', '\040', '\156', '\147', '\040', '\061', - '\012', '\163', '\120', '\166', '\040', '\163', '\164', '\040', '\061', - '\012', '\166', '\110', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\156', '\142', '\110', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\106', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\161', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\106', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\105', '\142', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\106', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\105', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\143', '\111', '\040', '\143', '\150', '\040', '\061', - '\012', '\142', '\115', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\172', '\132', '\167', '\040', '\163', '\172', '\040', '\061', - '\012', '\150', '\152', '\117', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\113', '\170', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\147', '\103', '\040', '\156', '\147', '\040', '\061', - '\012', '\143', '\156', '\114', '\040', '\141', '\156', '\040', '\061', - '\012', '\106', '\144', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\107', '\146', '\040', '\142', '\145', '\040', '\061', - '\012', '\123', '\152', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\142', '\115', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\130', '\167', '\040', '\166', '\141', '\040', '\061', - '\012', '\107', '\146', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\103', '\167', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\152', '\163', '\121', '\040', '\163', '\164', '\040', '\061', - '\012', '\132', '\147', '\166', '\040', '\156', '\147', '\040', '\061', - '\012', '\154', '\120', '\146', '\040', '\154', '\145', '\040', '\061', - '\012', '\156', '\155', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\126', '\144', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\143', '\130', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\152', '\124', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\167', '\105', '\040', '\155', '\145', '\040', '\061', - '\012', '\161', '\114', '\155', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\110', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\164', '\156', '\040', '\164', '\150', '\040', '\061', - '\012', '\116', '\164', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\147', '\127', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\120', '\161', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\160', '\120', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\122', '\146', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\160', '\114', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\156', '\104', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\160', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\144', '\172', '\123', '\040', '\163', '\172', '\040', '\061', - '\012', '\164', '\132', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\171', '\147', '\115', '\040', '\156', '\147', '\040', '\061', - '\012', '\142', '\170', '\103', '\040', '\142', '\145', '\040', '\061', - '\012', '\144', '\146', '\125', '\040', '\144', '\145', '\040', '\061', - '\012', '\142', '\155', '\102', '\040', '\155', '\145', '\040', '\061', - '\012', '\154', '\102', '\172', '\040', '\154', '\145', '\040', '\061', - '\012', '\147', '\112', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\131', '\153', '\166', '\040', '\153', '\141', '\040', '\061', - '\012', '\132', '\144', '\153', '\040', '\144', '\145', '\040', '\061', - '\012', '\167', '\156', '\121', '\040', '\141', '\156', '\040', '\061', - '\012', '\164', '\132', '\152', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\172', '\155', '\040', '\163', '\172', '\040', '\061', - '\012', '\126', '\146', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\115', '\167', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\162', '\125', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\161', '\167', '\160', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\143', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\146', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\165', '\157', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\103', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\151', '\121', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\102', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\126', '\142', '\040', '\163', '\164', '\040', '\061', - '\012', '\160', '\152', '\125', '\040', '\151', '\152', '\040', '\061', - '\012', '\163', '\143', '\121', '\040', '\143', '\150', '\040', '\061', - '\012', '\160', '\161', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\166', '\132', '\040', '\163', '\164', '\040', '\061', - '\012', '\132', '\160', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\160', '\151', '\126', '\040', '\151', '\156', '\040', '\061', - '\012', '\153', '\142', '\120', '\040', '\153', '\141', '\040', '\061', - '\012', '\167', '\161', '\115', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\126', '\142', '\040', '\145', '\162', '\040', '\061', - '\012', '\161', '\132', '\162', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\170', '\117', '\040', '\164', '\150', '\040', '\061', - '\012', '\167', '\124', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\112', '\172', '\146', '\040', '\163', '\172', '\040', '\061', - '\012', '\121', '\152', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\165', '\131', '\166', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\167', '\113', '\040', '\160', '\162', '\040', '\061', - '\012', '\150', '\166', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\104', '\161', '\145', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\146', '\111', '\040', '\160', '\162', '\040', '\061', - '\012', '\155', '\150', '\126', '\040', '\164', '\150', '\040', '\061', - '\012', '\152', '\147', '\105', '\040', '\156', '\147', '\040', '\061', - '\012', '\162', '\143', '\121', '\040', '\143', '\150', '\040', '\061', - '\012', '\153', '\155', '\124', '\040', '\153', '\141', '\040', '\061', - '\012', '\127', '\172', '\152', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\116', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\120', '\142', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\172', '\166', '\102', '\040', '\163', '\172', '\040', '\061', - '\012', '\170', '\150', '\112', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\166', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\116', '\166', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\163', '\167', '\132', '\040', '\163', '\164', '\040', '\061', - '\012', '\152', '\147', '\106', '\040', '\156', '\147', '\040', '\061', - '\012', '\155', '\146', '\114', '\040', '\155', '\145', '\040', '\061', - '\012', '\172', '\153', '\114', '\040', '\163', '\172', '\040', '\061', - '\012', '\152', '\126', '\160', '\040', '\151', '\152', '\040', '\061', - '\012', '\104', '\153', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\170', '\165', '\131', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\110', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\123', '\146', '\040', '\143', '\150', '\040', '\061', - '\012', '\112', '\172', '\144', '\040', '\163', '\172', '\040', '\061', - '\012', '\154', '\161', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\115', '\144', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\147', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\146', '\170', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\164', '\122', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\106', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\105', '\157', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\157', '\131', '\040', '\157', '\156', '\040', '\061', - '\012', '\101', '\167', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\124', '\170', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\143', '\111', '\147', '\040', '\143', '\150', '\040', '\061', - '\012', '\170', '\125', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\122', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\112', '\170', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\151', '\120', '\146', '\040', '\151', '\156', '\040', '\061', - '\012', '\145', '\152', '\131', '\040', '\145', '\162', '\040', '\061', - '\012', '\130', '\164', '\163', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\146', '\124', '\040', '\160', '\162', '\040', '\061', - '\012', '\120', '\161', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\163', '\126', '\040', '\163', '\164', '\040', '\061', - '\012', '\171', '\160', '\103', '\040', '\160', '\162', '\040', '\061', - '\012', '\167', '\115', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\105', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\170', '\131', '\040', '\166', '\141', '\040', '\061', - '\012', '\146', '\125', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\104', '\146', '\146', '\040', '\146', '\157', '\040', '\061', - '\012', '\147', '\161', '\121', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\115', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\166', '\112', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\146', '\120', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\144', '\114', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\144', '\115', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\116', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\141', '\107', '\166', '\040', '\141', '\156', '\040', '\061', - '\012', '\166', '\166', '\104', '\040', '\166', '\141', '\040', '\061', - '\012', '\144', '\112', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\170', '\131', '\040', '\145', '\162', '\040', '\061', - '\012', '\162', '\127', '\152', '\040', '\145', '\162', '\040', '\061', - '\012', '\120', '\166', '\170', '\040', '\166', '\141', '\040', '\061', - '\012', '\162', '\150', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\122', '\144', '\040', '\163', '\172', '\040', '\061', - '\012', '\113', '\147', '\166', '\040', '\156', '\147', '\040', '\061', - '\012', '\130', '\166', '\171', '\040', '\166', '\141', '\040', '\061', - '\012', '\153', '\132', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\153', '\160', '\113', '\040', '\153', '\141', '\040', '\061', - '\012', '\120', '\146', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\167', '\125', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\167', '\127', '\170', '\040', '\167', '\141', '\040', '\061', - '\012', '\152', '\120', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\147', '\114', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\151', '\112', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\147', '\120', '\170', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\110', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\166', '\112', '\142', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\150', '\102', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\121', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\105', '\157', '\141', '\040', '\141', '\156', '\040', '\061', - '\012', '\160', '\152', '\117', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\106', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\163', '\130', '\157', '\040', '\157', '\156', '\040', '\061', - '\012', '\167', '\142', '\131', '\040', '\167', '\141', '\040', '\061', - '\012', '\143', '\152', '\117', '\040', '\143', '\150', '\040', '\061', - '\012', '\155', '\154', '\132', '\040', '\154', '\145', '\040', '\061', - '\012', '\142', '\116', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\153', '\152', '\120', '\040', '\151', '\152', '\040', '\061', - '\012', '\171', '\130', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\126', '\152', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\116', '\166', '\040', '\166', '\141', '\040', '\061', - '\012', '\147', '\152', '\127', '\040', '\156', '\147', '\040', '\061', - '\012', '\156', '\130', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\144', '\161', '\112', '\040', '\161', '\165', '\040', '\061', - '\012', '\110', '\156', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\171', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\153', '\166', '\102', '\040', '\153', '\141', '\040', '\061', - '\012', '\161', '\171', '\102', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\104', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\172', '\147', '\120', '\040', '\156', '\147', '\040', '\061', - '\012', '\132', '\172', '\153', '\040', '\163', '\172', '\040', '\061', - '\012', '\146', '\115', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\172', '\131', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\142', '\124', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\117', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\163', '\101', '\040', '\163', '\164', '\040', '\061', - '\012', '\147', '\114', '\152', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\170', '\110', '\040', '\163', '\172', '\040', '\061', - '\012', '\143', '\114', '\155', '\040', '\143', '\150', '\040', '\061', - '\012', '\104', '\156', '\153', '\040', '\141', '\156', '\040', '\061', - '\012', '\172', '\111', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\153', '\160', '\112', '\040', '\153', '\141', '\040', '\061', - '\012', '\170', '\162', '\113', '\040', '\145', '\162', '\040', '\061', - '\012', '\145', '\111', '\142', '\040', '\145', '\162', '\040', '\061', - '\012', '\112', '\142', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\102', '\161', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\130', '\147', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\152', '\153', '\040', '\151', '\152', '\040', '\061', - '\012', '\144', '\122', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\164', '\152', '\132', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\121', '\154', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\171', '\127', '\040', '\151', '\156', '\040', '\061', - '\012', '\112', '\167', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\132', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\112', '\160', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\102', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\172', '\162', '\107', '\040', '\145', '\162', '\040', '\061', - '\012', '\150', '\127', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\144', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\161', '\163', '\132', '\040', '\161', '\165', '\040', '\061', - '\012', '\143', '\121', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\143', '\143', '\116', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\167', '\115', '\040', '\167', '\141', '\040', '\061', - '\012', '\147', '\142', '\130', '\040', '\156', '\147', '\040', '\061', - '\012', '\164', '\146', '\124', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\167', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\121', '\142', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\171', '\145', '\131', '\040', '\145', '\162', '\040', '\061', - '\012', '\141', '\125', '\142', '\040', '\141', '\156', '\040', '\061', - '\012', '\161', '\110', '\167', '\040', '\161', '\165', '\040', '\061', - '\012', '\106', '\150', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\106', '\156', '\147', '\040', '\141', '\156', '\040', '\061', - '\012', '\154', '\166', '\111', '\040', '\154', '\145', '\040', '\061', - '\012', '\152', '\103', '\146', '\040', '\151', '\152', '\040', '\061', - '\012', '\150', '\161', '\110', '\040', '\164', '\150', '\040', '\061', - '\012', '\164', '\124', '\161', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\146', '\111', '\040', '\163', '\164', '\040', '\061', - '\012', '\166', '\163', '\115', '\040', '\163', '\164', '\040', '\061', - '\012', '\154', '\104', '\160', '\040', '\154', '\145', '\040', '\061', - '\012', '\167', '\112', '\142', '\040', '\167', '\141', '\040', '\061', - '\012', '\142', '\150', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\122', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\164', '\123', '\040', '\164', '\150', '\040', '\061', - '\012', '\132', '\167', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\112', '\142', '\150', '\040', '\164', '\150', '\040', '\061', - '\012', '\150', '\110', '\142', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\104', '\171', '\040', '\160', '\162', '\040', '\061', - '\012', '\163', '\152', '\104', '\040', '\163', '\164', '\040', '\061', - '\012', '\117', '\171', '\160', '\040', '\160', '\162', '\040', '\061', - '\012', '\161', '\167', '\104', '\040', '\161', '\165', '\040', '\061', - '\012', '\152', '\142', '\104', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\160', '\107', '\040', '\166', '\141', '\040', '\061', - '\012', '\127', '\152', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\160', '\102', '\040', '\166', '\141', '\040', '\061', - '\012', '\141', '\130', '\161', '\040', '\141', '\156', '\040', '\061', - '\012', '\155', '\127', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\110', '\151', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\171', '\116', '\040', '\156', '\171', '\040', '\061', - '\012', '\155', '\142', '\121', '\040', '\155', '\145', '\040', '\061', - '\012', '\171', '\167', '\103', '\040', '\167', '\141', '\040', '\061', - '\012', '\157', '\126', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\155', '\132', '\040', '\155', '\145', '\040', '\061', - '\012', '\163', '\154', '\117', '\040', '\154', '\145', '\040', '\061', - '\012', '\146', '\130', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\153', '\131', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\160', '\126', '\165', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\153', '\125', '\040', '\153', '\141', '\040', '\061', - '\012', '\102', '\162', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\103', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\143', '\170', '\040', '\143', '\150', '\040', '\061', - '\012', '\172', '\115', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\122', '\167', '\040', '\143', '\150', '\040', '\061', - '\012', '\147', '\172', '\121', '\040', '\156', '\147', '\040', '\061', - '\012', '\121', '\142', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\152', '\165', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\170', '\123', '\172', '\040', '\163', '\172', '\040', '\061', - '\012', '\126', '\147', '\172', '\040', '\156', '\147', '\040', '\061', - '\012', '\157', '\115', '\167', '\040', '\157', '\156', '\040', '\061', - '\012', '\146', '\160', '\105', '\040', '\160', '\162', '\040', '\061', - '\012', '\170', '\152', '\130', '\040', '\151', '\152', '\040', '\061', - '\012', '\161', '\103', '\147', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\167', '\115', '\040', '\163', '\172', '\040', '\061', - '\012', '\165', '\121', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\161', '\120', '\153', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\152', '\104', '\040', '\151', '\152', '\040', '\061', - '\012', '\121', '\172', '\155', '\040', '\163', '\172', '\040', '\061', - '\012', '\163', '\111', '\160', '\040', '\163', '\164', '\040', '\061', - '\012', '\165', '\157', '\107', '\040', '\161', '\165', '\040', '\061', - '\012', '\162', '\126', '\154', '\040', '\145', '\162', '\040', '\061', - '\012', '\143', '\142', '\113', '\040', '\143', '\150', '\040', '\061', - '\012', '\150', '\130', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\113', '\163', '\146', '\040', '\163', '\164', '\040', '\061', - '\012', '\153', '\142', '\106', '\040', '\153', '\141', '\040', '\061', - '\012', '\167', '\102', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\151', '\131', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\163', '\147', '\110', '\040', '\156', '\147', '\040', '\061', - '\012', '\107', '\172', '\166', '\040', '\163', '\172', '\040', '\061', - '\012', '\171', '\166', '\105', '\040', '\166', '\141', '\040', '\061', - '\012', '\170', '\113', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\127', '\146', '\040', '\163', '\164', '\040', '\061', - '\012', '\172', '\102', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\171', '\153', '\110', '\040', '\153', '\141', '\040', '\061', - '\012', '\166', '\152', '\110', '\040', '\151', '\152', '\040', '\061', - '\012', '\167', '\150', '\111', '\040', '\164', '\150', '\040', '\061', - '\012', '\166', '\120', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\132', '\150', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\151', '\112', '\170', '\040', '\151', '\156', '\040', '\061', - '\012', '\143', '\132', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\161', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\115', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\143', '\125', '\152', '\040', '\143', '\150', '\040', '\061', - '\012', '\166', '\115', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\143', '\112', '\040', '\143', '\150', '\040', '\061', - '\012', '\102', '\143', '\155', '\040', '\143', '\150', '\040', '\061', - '\012', '\152', '\130', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\170', '\157', '\111', '\040', '\157', '\156', '\040', '\061', - '\012', '\132', '\153', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\130', '\172', '\162', '\040', '\145', '\162', '\040', '\061', - '\012', '\171', '\172', '\115', '\040', '\163', '\172', '\040', '\061', - '\012', '\161', '\152', '\130', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\116', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\160', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\102', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\164', '\130', '\144', '\040', '\164', '\150', '\040', '\061', - '\012', '\130', '\153', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\110', '\163', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\142', '\161', '\125', '\040', '\161', '\165', '\040', '\061', - '\012', '\163', '\147', '\106', '\040', '\156', '\147', '\040', '\061', - '\012', '\144', '\120', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\112', '\170', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\125', '\147', '\160', '\040', '\156', '\147', '\040', '\061', - '\012', '\122', '\170', '\151', '\040', '\151', '\156', '\040', '\061', - '\012', '\113', '\167', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\172', '\153', '\104', '\040', '\163', '\172', '\040', '\061', - '\012', '\122', '\161', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\160', '\112', '\142', '\040', '\160', '\162', '\040', '\061', - '\012', '\146', '\143', '\126', '\040', '\143', '\150', '\040', '\061', - '\012', '\151', '\126', '\144', '\040', '\151', '\156', '\040', '\061', - '\012', '\142', '\102', '\160', '\040', '\142', '\145', '\040', '\061', - '\012', '\117', '\152', '\167', '\040', '\151', '\152', '\040', '\061', - '\012', '\166', '\132', '\154', '\040', '\154', '\145', '\040', '\061', - '\012', '\111', '\171', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\146', '\153', '\125', '\040', '\153', '\141', '\040', '\061', - '\012', '\113', '\143', '\161', '\040', '\143', '\150', '\040', '\061', - '\012', '\144', '\102', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\115', '\161', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\151', '\115', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\127', '\167', '\163', '\040', '\163', '\164', '\040', '\061', - '\012', '\164', '\161', '\130', '\040', '\164', '\150', '\040', '\061', - '\012', '\170', '\150', '\104', '\040', '\164', '\150', '\040', '\061', - '\012', '\162', '\116', '\154', '\040', '\145', '\162', '\040', '\061', - '\012', '\160', '\127', '\144', '\040', '\144', '\145', '\040', '\061', - '\012', '\152', '\162', '\126', '\040', '\145', '\162', '\040', '\061', - '\012', '\102', '\155', '\152', '\040', '\151', '\152', '\040', '\061', - '\012', '\110', '\155', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\166', '\154', '\110', '\040', '\154', '\145', '\040', '\061', - '\012', '\115', '\170', '\142', '\040', '\142', '\145', '\040', '\061', - '\012', '\171', '\171', '\123', '\040', '\156', '\171', '\040', '\061', - '\012', '\161', '\166', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\146', '\166', '\130', '\040', '\166', '\141', '\040', '\061', - '\012', '\126', '\146', '\145', '\040', '\145', '\162', '\040', '\061', - '\012', '\103', '\144', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\113', '\147', '\145', '\040', '\156', '\147', '\040', '\061', - '\012', '\121', '\145', '\152', '\040', '\145', '\162', '\040', '\061', - '\012', '\162', '\166', '\132', '\040', '\145', '\162', '\040', '\061', - '\012', '\166', '\172', '\111', '\040', '\163', '\172', '\040', '\061', - '\012', '\144', '\104', '\156', '\040', '\141', '\156', '\040', '\061', - '\012', '\156', '\167', '\123', '\040', '\141', '\156', '\040', '\061', - '\012', '\121', '\143', '\142', '\040', '\143', '\150', '\040', '\061', - '\012', '\167', '\153', '\126', '\040', '\153', '\141', '\040', '\061', - '\012', '\165', '\103', '\170', '\040', '\161', '\165', '\040', '\061', - '\012', '\111', '\147', '\153', '\040', '\156', '\147', '\040', '\061', - '\012', '\126', '\160', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\150', '\102', '\155', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\144', '\121', '\040', '\144', '\145', '\040', '\061', - '\012', '\146', '\147', '\121', '\040', '\156', '\147', '\040', '\061', - '\012', '\171', '\121', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\147', '\170', '\110', '\040', '\156', '\147', '\040', '\061', - '\012', '\160', '\161', '\113', '\040', '\161', '\165', '\040', '\061', - '\012', '\154', '\122', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\130', '\144', '\166', '\040', '\144', '\145', '\040', '\061', - '\012', '\150', '\104', '\172', '\040', '\164', '\150', '\040', '\061', - '\012', '\144', '\106', '\167', '\040', '\144', '\145', '\040', '\061', - '\012', '\161', '\121', '\165', '\040', '\165', '\156', '\040', '\061', - '\012', '\170', '\142', '\104', '\040', '\142', '\145', '\040', '\061', - '\012', '\161', '\155', '\105', '\040', '\161', '\165', '\040', '\061', - '\012', '\155', '\127', '\155', '\040', '\155', '\145', '\040', '\061', - '\012', '\152', '\102', '\142', '\040', '\151', '\152', '\040', '\061', - '\012', '\152', '\130', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\146', '\170', '\125', '\040', '\146', '\157', '\040', '\061', - '\012', '\130', '\167', '\143', '\040', '\143', '\150', '\040', '\061', - '\012', '\114', '\161', '\146', '\040', '\161', '\165', '\040', '\061', - '\012', '\150', '\143', '\120', '\040', '\164', '\150', '\040', '\061', - '\012', '\160', '\146', '\102', '\040', '\160', '\162', '\040', '\061', - '\012', '\166', '\123', '\147', '\040', '\156', '\147', '\040', '\061', - '\012', '\170', '\112', '\167', '\040', '\167', '\141', '\040', '\061', - '\012', '\155', '\122', '\146', '\040', '\155', '\145', '\040', '\061', - '\012', '\150', '\161', '\127', '\040', '\164', '\150', '\040', '\061', - '\012', '\156', '\126', '\142', '\040', '\141', '\156', '\040', '\061', - '\012', '\143', '\105', '\165', '\040', '\143', '\150', '\040', '\061', - '\012', '\156', '\146', '\116', '\040', '\141', '\156', '\040', '\061', - '\012', '\156', '\126', '\152', '\040', '\141', '\156', '\040', '\061', - '\012', '\122', '\167', '\153', '\040', '\153', '\141', '\040', '\061', - '\012', '\156', '\155', '\107', '\040', '\141', '\156', '\040', '\061', - '\012', '\157', '\104', '\164', '\040', '\164', '\150', '\040', '\061', - '\012', '\153', '\120', '\142', '\040', '\153', '\141', '\040', '\061', - '\012', '\147', '\161', '\127', '\040', '\161', '\165', '\040', '\061', - '\012', '\121', '\150', '\146', '\040', '\164', '\150', '\040', '\061', - '\012', '\161', '\132', '\154', '\040', '\161', '\165', '\040', '\061', - '\012', '\172', '\110', '\161', '\040', '\161', '\165', '\040', '\061', - '\012', '\151', '\130', '\154', '\040', '\151', '\156', '\040', '\061', - '\012', -}; - -extern const int ksizeofUniversalAmbigsFile = sizeof(kUniversalAmbigsFile); - -} // namespace tesseract +/////////////////////////////////////////////////////////////////////// +// File: universalambigs.cpp +// Description: Data for a universal ambigs file that is useful for +// any language. +// Author: Ray Smith +// Created: Mon Mar 18 11:26:00 PDT 2013 +// +// (C) Copyright 2013, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +namespace tesseract { + +extern const char kUniversalAmbigsFile[] = { + '\166', '\062', '\012', '\047', '\047', '\040', '\042', '\040', '\061', + '\012', '\140', '\047', '\040', '\042', '\040', '\061', '\012', '\047', + '\140', '\040', '\042', '\040', '\061', '\012', '\342', '\200', '\230', + '\047', '\040', '\042', '\040', '\061', '\012', '\047', '\342', '\200', + '\230', '\040', '\042', '\040', '\061', '\012', '\342', '\200', '\231', + '\047', '\040', '\042', '\040', '\061', '\012', '\047', '\342', '\200', + '\231', '\040', '\042', '\040', '\061', '\012', '\140', '\140', '\040', + '\042', '\040', '\061', '\012', '\140', '\342', '\200', '\230', '\040', + '\042', '\040', '\061', '\012', '\342', '\200', '\230', '\140', '\040', + '\042', '\040', '\061', '\012', '\140', '\342', '\200', '\231', '\040', + '\042', '\040', '\061', '\012', '\342', '\200', '\231', '\140', '\040', + '\042', '\040', '\061', '\012', '\342', '\200', '\230', '\342', '\200', + '\230', '\040', '\342', '\200', '\234', '\040', '\061', '\012', '\342', + '\200', '\230', '\342', '\200', '\231', '\040', '\042', '\040', '\061', + '\012', '\342', '\200', '\231', '\342', '\200', '\230', '\040', '\042', + '\040', '\061', '\012', '\342', '\200', '\231', '\342', '\200', '\231', + '\040', '\342', '\200', '\235', '\040', '\061', '\012', '\054', '\054', + '\040', '\342', '\200', '\236', '\040', '\061', '\012', '\155', '\040', + '\162', '\156', '\040', '\060', '\012', '\162', '\156', '\040', '\155', + '\040', '\060', '\012', '\155', '\040', '\151', '\156', '\040', '\060', + '\012', '\151', '\156', '\040', '\155', '\040', '\060', '\012', '\144', + '\040', '\143', '\154', '\040', '\060', '\012', '\143', '\154', '\040', + '\144', '\040', '\060', '\012', '\156', '\156', '\040', '\162', '\155', + '\040', '\060', '\012', '\162', '\155', '\040', '\156', '\156', '\040', + '\060', '\012', '\156', '\040', '\162', '\151', '\040', '\060', '\012', + '\162', '\151', '\040', '\156', '\040', '\060', '\012', '\154', '\151', + '\040', '\150', '\040', '\060', '\012', '\154', '\162', '\040', '\150', + '\040', '\060', '\012', '\151', '\151', '\040', '\165', '\040', '\060', + '\012', '\151', '\151', '\040', '\156', '\040', '\060', '\012', '\156', + '\151', '\040', '\155', '\040', '\060', '\012', '\151', '\151', '\151', + '\040', '\155', '\040', '\060', '\012', '\154', '\154', '\040', '\110', + '\040', '\060', '\012', '\111', '\055', '\111', '\040', '\110', '\040', + '\060', '\012', '\166', '\166', '\040', '\167', '\040', '\060', '\012', + '\126', '\126', '\040', '\127', '\040', '\060', '\012', '\164', '\040', + '\146', '\040', '\060', '\012', '\146', '\040', '\164', '\040', '\060', + '\012', '\141', '\040', '\157', '\040', '\060', '\012', '\157', '\040', + '\141', '\040', '\060', '\012', '\145', '\040', '\143', '\040', '\060', + '\012', '\143', '\040', '\145', '\040', '\060', '\012', '\162', '\162', + '\040', '\156', '\040', '\060', '\012', '\105', '\040', '\146', '\151', + '\040', '\060', '\012', '\154', '\074', '\040', '\153', '\040', '\060', + '\012', '\154', '\144', '\040', '\153', '\151', '\040', '\060', '\012', + '\154', '\170', '\040', '\150', '\040', '\060', '\012', '\170', '\156', + '\040', '\155', '\040', '\060', '\012', '\165', '\170', '\040', '\151', + '\156', '\040', '\060', '\012', '\162', '\040', '\164', '\040', '\060', + '\012', '\144', '\040', '\164', '\154', '\040', '\060', '\012', '\144', + '\151', '\040', '\164', '\150', '\040', '\060', '\012', '\165', '\162', + '\040', '\151', '\156', '\040', '\060', '\012', '\165', '\156', '\040', + '\151', '\155', '\040', '\060', '\012', '\165', '\040', '\141', '\040', + '\060', '\012', '\157', '\040', '\303', '\263', '\040', '\060', '\012', + '\303', '\263', '\040', '\157', '\040', '\060', '\012', '\151', '\040', + '\303', '\255', '\040', '\060', '\012', '\303', '\255', '\040', '\151', + '\040', '\060', '\012', '\141', '\040', '\303', '\241', '\040', '\060', + '\012', '\303', '\241', '\040', '\141', '\040', '\060', '\012', '\145', + '\040', '\303', '\251', '\040', '\060', '\012', '\303', '\251', '\040', + '\145', '\040', '\060', '\012', '\165', '\040', '\303', '\272', '\040', + '\060', '\012', '\303', '\272', '\040', '\165', '\040', '\060', '\012', + '\156', '\040', '\303', '\261', '\040', '\060', '\012', '\303', '\261', + '\040', '\156', '\040', '\060', '\012', '\060', '\040', '\157', '\040', + '\060', '\012', '\144', '\040', '\164', '\162', '\040', '\060', '\012', + '\156', '\040', '\164', '\162', '\040', '\060', '\012', '\303', '\261', + '\040', '\146', '\151', '\040', '\060', '\012', '\165', '\040', '\164', + '\151', '\040', '\060', '\012', '\303', '\261', '\040', '\164', '\151', + '\040', '\060', '\012', '\144', '\040', '\164', '\151', '\040', '\060', + '\012', '\144', '\040', '\164', '\303', '\255', '\040', '\060', '\012', + '\144', '\040', '\162', '\303', '\255', '\040', '\060', '\012', '\141', + '\040', '\303', '\240', '\040', '\060', '\012', '\145', '\040', '\303', + '\250', '\040', '\060', '\012', '\156', '\040', '\151', '\152', '\040', + '\060', '\012', '\147', '\040', '\151', '\152', '\040', '\060', '\012', + '\157', '\040', '\303', '\262', '\040', '\060', '\012', '\105', '\040', + '\303', '\211', '\040', '\060', '\012', '\105', '\040', '\303', '\210', + '\040', '\060', '\012', '\165', '\040', '\303', '\274', '\040', '\060', + '\012', '\170', '\156', '\105', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\131', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\164', '\105', '\040', '\156', '\164', '\040', '\061', + '\012', '\124', '\154', '\142', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\170', '\116', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\152', '\121', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\160', '\106', '\040', '\151', '\152', '\040', '\061', + '\012', '\131', '\162', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\141', '\161', '\131', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\166', '\112', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\142', '\114', '\040', '\142', '\145', '\040', '\061', + '\012', '\116', '\166', '\153', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\112', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\167', '\170', '\103', '\040', '\167', '\141', '\040', '\061', + '\012', '\143', '\165', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\172', '\164', '\040', '\164', '\141', '\040', '\061', + '\012', '\161', '\113', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\163', '\143', '\112', '\040', '\163', '\164', '\040', '\061', + '\012', '\160', '\130', '\160', '\040', '\160', '\157', '\040', '\061', + '\012', '\126', '\161', '\151', '\040', '\164', '\151', '\040', '\061', + '\012', '\125', '\170', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\153', '\112', '\166', '\040', '\153', '\141', '\040', '\061', + '\012', '\131', '\153', '\144', '\040', '\153', '\141', '\040', '\061', + '\012', '\166', '\160', '\130', '\040', '\166', '\141', '\040', '\061', + '\012', '\151', '\102', '\166', '\040', '\164', '\151', '\040', '\061', + '\012', '\172', '\122', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\124', '\155', '\040', '\155', '\151', '\040', '\061', + '\012', '\155', '\113', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\126', '\172', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\164', '\160', '\040', '\164', '\151', '\040', '\061', + '\012', '\155', '\166', '\104', '\040', '\166', '\141', '\040', '\061', + '\012', '\155', '\104', '\161', '\040', '\155', '\145', '\040', '\061', + '\012', '\152', '\170', '\120', '\040', '\151', '\152', '\040', '\061', + '\012', '\102', '\170', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\157', '\111', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\166', '\143', '\040', '\166', '\141', '\040', '\061', + '\012', '\165', '\103', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\101', '\157', '\040', '\166', '\157', '\040', '\061', + '\012', '\161', '\165', '\102', '\040', '\164', '\165', '\040', '\061', + '\012', '\142', '\164', '\126', '\040', '\164', '\151', '\040', '\061', + '\012', '\114', '\155', '\143', '\040', '\155', '\145', '\040', '\061', + '\012', '\164', '\126', '\167', '\040', '\164', '\151', '\040', '\061', + '\012', '\131', '\170', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\110', '\170', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\144', '\126', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\131', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\120', '\152', '\040', '\164', '\165', '\040', '\061', + '\012', '\146', '\124', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\122', '\152', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\144', '\101', '\040', '\144', '\151', '\040', '\061', + '\012', '\152', '\172', '\116', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\170', '\114', '\040', '\155', '\145', '\040', '\061', + '\012', '\171', '\147', '\112', '\040', '\156', '\147', '\040', '\061', + '\012', '\126', '\166', '\147', '\040', '\166', '\141', '\040', '\061', + '\012', '\162', '\152', '\113', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\165', '\126', '\040', '\164', '\165', '\040', '\061', + '\012', '\163', '\127', '\153', '\040', '\153', '\165', '\040', '\061', + '\012', '\120', '\147', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\110', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\172', '\153', '\125', '\040', '\153', '\165', '\040', '\061', + '\012', '\147', '\166', '\107', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\144', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\126', '\142', '\040', '\155', '\145', '\040', '\061', + '\012', '\121', '\147', '\144', '\040', '\144', '\151', '\040', '\061', + '\012', '\172', '\143', '\132', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\161', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\163', '\112', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\146', '\116', '\040', '\144', '\151', '\040', '\061', + '\012', '\144', '\147', '\127', '\040', '\144', '\151', '\040', '\061', + '\012', '\167', '\116', '\162', '\040', '\162', '\151', '\040', '\061', + '\012', '\172', '\166', '\103', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\131', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\110', '\171', '\040', '\164', '\165', '\040', '\061', + '\012', '\164', '\116', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\170', '\112', '\040', '\154', '\151', '\040', '\061', + '\012', '\110', '\142', '\153', '\040', '\153', '\165', '\040', '\061', + '\012', '\170', '\163', '\107', '\040', '\163', '\164', '\040', '\061', + '\012', '\166', '\123', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\106', '\142', '\040', '\142', '\165', '\040', '\061', + '\012', '\116', '\164', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\157', '\102', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\153', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\126', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\152', '\124', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\166', '\130', '\040', '\166', '\141', '\040', '\061', + '\012', '\157', '\132', '\146', '\040', '\164', '\157', '\040', '\061', + '\012', '\153', '\143', '\125', '\040', '\153', '\157', '\040', '\061', + '\012', '\146', '\106', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\130', '\142', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\113', '\161', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\122', '\167', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\144', '\166', '\112', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\156', '\112', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\161', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\170', '\115', '\040', '\160', '\157', '\040', '\061', + '\012', '\145', '\102', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\112', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\170', '\156', '\115', '\040', '\156', '\147', '\040', '\061', + '\012', '\141', '\103', '\161', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\110', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\164', '\146', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\161', '\156', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\123', '\163', '\040', '\151', '\163', '\040', '\061', + '\012', '\163', '\102', '\167', '\040', '\163', '\164', '\040', '\061', + '\012', '\106', '\150', '\156', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\116', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\115', '\166', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\142', '\126', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\110', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\114', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\147', '\106', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\170', '\127', '\040', '\166', '\141', '\040', '\061', + '\012', '\143', '\144', '\131', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\162', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\105', '\146', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\161', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\172', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\150', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\150', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\106', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\126', '\143', '\040', '\166', '\141', '\040', '\061', + '\012', '\154', '\115', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\124', '\161', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\101', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\151', '\115', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\116', '\154', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\142', '\120', '\040', '\163', '\172', '\040', '\061', + '\012', '\153', '\126', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\145', '\121', '\154', '\040', '\164', '\145', '\040', '\061', + '\012', '\163', '\127', '\142', '\040', '\163', '\164', '\040', '\061', + '\012', '\102', '\161', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\130', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\166', '\125', '\143', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\117', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\165', '\110', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\116', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\106', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\115', '\154', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\153', '\155', '\132', '\040', '\153', '\141', '\040', '\061', + '\012', '\163', '\122', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\161', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\146', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\170', '\121', '\040', '\166', '\141', '\040', '\061', + '\012', '\154', '\103', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\131', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\164', '\146', '\123', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\144', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\121', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\144', '\130', '\040', '\144', '\145', '\040', '\061', + '\012', '\155', '\116', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\153', '\106', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\152', '\123', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\120', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\167', '\143', '\127', '\040', '\143', '\150', '\040', '\061', + '\012', '\116', '\152', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\126', '\160', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\161', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\112', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\160', '\110', '\040', '\160', '\157', '\040', '\061', + '\012', '\170', '\161', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\126', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\102', '\164', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\155', '\102', '\040', '\156', '\164', '\040', '\061', + '\012', '\172', '\143', '\115', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\146', '\107', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\146', '\117', '\040', '\155', '\145', '\040', '\061', + '\012', '\131', '\150', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\132', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\155', '\172', '\102', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\122', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\171', '\104', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\147', '\146', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\161', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\111', '\165', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\142', '\127', '\040', '\145', '\162', '\040', '\061', + '\012', '\112', '\155', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\113', '\166', '\152', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\143', '\104', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\147', '\103', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\103', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\127', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\167', '\127', '\040', '\167', '\141', '\040', '\061', + '\012', '\112', '\153', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\107', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\142', '\110', '\040', '\166', '\141', '\040', '\061', + '\012', '\154', '\124', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\145', '\103', '\142', '\040', '\145', '\162', '\040', '\061', + '\012', '\152', '\126', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\104', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\157', '\121', '\040', '\160', '\157', '\040', '\061', + '\012', '\161', '\164', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\122', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\110', '\166', '\147', '\040', '\166', '\141', '\040', '\061', + '\012', '\165', '\101', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\146', '\127', '\040', '\155', '\145', '\040', '\061', + '\012', '\164', '\147', '\123', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\161', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\146', '\131', '\040', '\163', '\172', '\040', '\061', + '\012', '\131', '\150', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\161', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\160', '\113', '\040', '\160', '\162', '\040', '\061', + '\012', '\112', '\172', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\121', '\153', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\152', '\117', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\170', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\120', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\116', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\166', '\121', '\040', '\166', '\141', '\040', '\061', + '\012', '\153', '\107', '\167', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\165', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\166', '\171', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\131', '\145', '\040', '\164', '\145', '\040', '\061', + '\012', '\146', '\132', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\131', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\150', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\170', '\131', '\040', '\146', '\157', '\040', '\061', + '\012', '\171', '\120', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\146', '\107', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\144', '\155', '\124', '\040', '\155', '\145', '\040', '\061', + '\012', '\166', '\146', '\130', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\121', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\170', '\123', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\172', '\101', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\141', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\142', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\153', '\126', '\144', '\040', '\153', '\141', '\040', '\061', + '\012', '\130', '\152', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\153', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\121', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\150', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\104', '\166', '\152', '\040', '\166', '\141', '\040', '\061', + '\012', '\126', '\142', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\146', '\160', '\116', '\040', '\160', '\162', '\040', '\061', + '\012', '\160', '\153', '\107', '\040', '\153', '\141', '\040', '\061', + '\012', '\142', '\114', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\112', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\167', '\112', '\040', '\167', '\141', '\040', '\061', + '\012', '\132', '\162', '\167', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\144', '\127', '\040', '\144', '\145', '\040', '\061', + '\012', '\127', '\147', '\146', '\040', '\156', '\147', '\040', '\061', + '\012', '\120', '\161', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\147', '\116', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\110', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\124', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\104', '\166', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\155', '\125', '\040', '\155', '\145', '\040', '\061', + '\012', '\170', '\150', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\103', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\167', '\126', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\166', '\114', '\040', '\166', '\141', '\040', '\061', + '\012', '\156', '\107', '\146', '\040', '\156', '\164', '\040', '\061', + '\012', '\152', '\152', '\103', '\040', '\151', '\152', '\040', '\061', + '\012', '\125', '\143', '\147', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\127', '\146', '\040', '\160', '\162', '\040', '\061', + '\012', '\152', '\170', '\107', '\040', '\151', '\152', '\040', '\061', + '\012', '\115', '\161', '\156', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\166', '\127', '\040', '\166', '\141', '\040', '\061', + '\012', '\154', '\127', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\155', '\144', '\117', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\116', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\167', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\146', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\165', '\117', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\150', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\114', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\102', '\171', '\040', '\146', '\157', '\040', '\061', + '\012', '\156', '\125', '\152', '\040', '\156', '\164', '\040', '\061', + '\012', '\154', '\124', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\154', '\120', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\162', '\122', '\040', '\145', '\162', '\040', '\061', + '\012', '\162', '\130', '\167', '\040', '\145', '\162', '\040', '\061', + '\012', '\145', '\126', '\167', '\040', '\166', '\145', '\040', '\061', + '\012', '\172', '\127', '\156', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\112', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\115', '\147', '\171', '\040', '\156', '\147', '\040', '\061', + '\012', '\165', '\132', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\124', '\144', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\161', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\104', '\150', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\155', '\113', '\040', '\155', '\145', '\040', '\061', + '\012', '\123', '\163', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\163', '\127', '\154', '\040', '\163', '\172', '\040', '\061', + '\012', '\151', '\161', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\152', '\107', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\152', '\102', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\113', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\166', '\111', '\040', '\166', '\141', '\040', '\061', + '\012', '\164', '\143', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\153', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\125', '\145', '\040', '\164', '\145', '\040', '\061', + '\012', '\154', '\125', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\102', '\147', '\040', '\156', '\164', '\040', '\061', + '\012', '\144', '\110', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\127', '\142', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\165', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\110', '\160', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\157', '\126', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\102', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\124', '\144', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\146', '\126', '\040', '\160', '\162', '\040', '\061', + '\012', '\161', '\147', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\143', '\125', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\143', '\116', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\153', '\101', '\040', '\166', '\141', '\040', '\061', + '\012', '\143', '\121', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\131', '\172', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\160', '\106', '\040', '\160', '\162', '\040', '\061', + '\012', '\166', '\102', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\120', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\155', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\145', '\127', '\146', '\040', '\166', '\145', '\040', '\061', + '\012', '\152', '\132', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\110', '\167', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\171', '\171', '\111', '\040', '\156', '\171', '\040', '\061', + '\012', '\132', '\146', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\114', '\147', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\165', '\161', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\117', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\144', '\153', '\112', '\040', '\153', '\157', '\040', '\061', + '\012', '\144', '\161', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\142', '\127', '\040', '\151', '\163', '\040', '\061', + '\012', '\172', '\115', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\156', '\112', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\115', '\143', '\040', '\153', '\157', '\040', '\061', + '\012', '\172', '\161', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\121', '\153', '\040', '\166', '\141', '\040', '\061', + '\012', '\145', '\161', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\106', '\156', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\143', '\132', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\107', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\153', '\172', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\132', '\170', '\040', '\170', '\145', '\040', '\061', + '\012', '\161', '\166', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\153', '\131', '\040', '\153', '\141', '\040', '\061', + '\012', '\142', '\162', '\110', '\040', '\145', '\162', '\040', '\061', + '\012', '\127', '\162', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\152', '\105', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\152', '\121', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\114', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\147', '\105', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\167', '\111', '\040', '\167', '\141', '\040', '\061', + '\012', '\151', '\104', '\167', '\040', '\164', '\151', '\040', '\061', + '\012', '\102', '\164', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\120', '\172', '\040', '\166', '\141', '\040', '\061', + '\012', '\171', '\161', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\106', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\154', '\121', '\171', '\040', '\154', '\145', '\040', '\061', + '\012', '\147', '\102', '\160', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\144', '\131', '\040', '\144', '\145', '\040', '\061', + '\012', '\164', '\166', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\152', '\117', '\040', '\154', '\145', '\040', '\061', + '\012', '\116', '\163', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\144', '\117', '\040', '\144', '\145', '\040', '\061', + '\012', '\147', '\172', '\127', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\164', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\146', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\132', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\143', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\166', '\121', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\110', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\142', '\115', '\040', '\142', '\145', '\040', '\061', + '\012', '\156', '\127', '\147', '\040', '\156', '\164', '\040', '\061', + '\012', '\131', '\167', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\130', '\167', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\170', '\113', '\040', '\160', '\162', '\040', '\061', + '\012', '\171', '\142', '\121', '\040', '\142', '\145', '\040', '\061', + '\012', '\127', '\166', '\155', '\040', '\166', '\141', '\040', '\061', + '\012', '\114', '\147', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\164', '\123', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\122', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\161', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\103', '\156', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\106', '\155', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\144', '\166', '\120', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\161', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\152', '\111', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\126', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\166', '\132', '\040', '\166', '\141', '\040', '\061', + '\012', '\103', '\167', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\125', '\171', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\106', '\146', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\157', '\130', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\150', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\127', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\162', '\130', '\040', '\166', '\141', '\040', '\061', + '\012', '\145', '\117', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\167', '\132', '\040', '\142', '\145', '\040', '\061', + '\012', '\144', '\156', '\126', '\040', '\156', '\147', '\040', '\061', + '\012', '\107', '\142', '\167', '\040', '\142', '\145', '\040', '\061', + '\012', '\170', '\107', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\155', '\156', '\132', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\160', '\116', '\040', '\160', '\162', '\040', '\061', + '\012', '\144', '\172', '\130', '\040', '\144', '\145', '\040', '\061', + '\012', '\102', '\170', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\160', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\161', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\124', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\167', '\120', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\143', '\170', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\144', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\167', '\130', '\040', '\167', '\141', '\040', '\061', + '\012', '\125', '\166', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\162', '\113', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\163', '\144', '\106', '\040', '\144', '\145', '\040', '\061', + '\012', '\112', '\143', '\147', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\172', '\117', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\124', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\152', '\120', '\040', '\144', '\145', '\040', '\061', + '\012', '\147', '\124', '\156', '\040', '\156', '\147', '\040', '\061', + '\012', '\107', '\164', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\147', '\101', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\144', '\114', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\172', '\117', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\150', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\155', '\160', '\040', '\155', '\145', '\040', '\061', + '\012', '\121', '\144', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\131', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\142', '\112', '\040', '\160', '\162', '\040', '\061', + '\012', '\152', '\122', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\130', '\163', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\147', '\111', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\150', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\107', '\147', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\106', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\167', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\170', '\127', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\103', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\143', '\114', '\040', '\143', '\150', '\040', '\061', + '\012', '\113', '\170', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\155', '\131', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\162', '\121', '\164', '\040', '\145', '\162', '\040', '\061', + '\012', '\132', '\170', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\144', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\167', '\110', '\040', '\144', '\145', '\040', '\061', + '\012', '\131', '\155', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\126', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\166', '\154', '\040', '\166', '\141', '\040', '\061', + '\012', '\171', '\110', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\127', '\152', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\115', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\172', '\125', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\143', '\114', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\117', '\141', '\040', '\161', '\165', '\040', '\061', + '\012', '\145', '\161', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\151', '\131', '\160', '\040', '\164', '\151', '\040', '\061', + '\012', '\166', '\103', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\157', '\126', '\040', '\162', '\157', '\040', '\061', + '\012', '\146', '\132', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\161', '\121', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\144', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\127', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\153', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\106', '\160', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\107', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\162', '\167', '\117', '\040', '\145', '\162', '\040', '\061', + '\012', '\121', '\172', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\113', '\161', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\147', '\124', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\163', '\132', '\040', '\163', '\172', '\040', '\061', + '\012', '\141', '\110', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\152', '\114', '\040', '\151', '\152', '\040', '\061', + '\012', '\131', '\143', '\167', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\156', '\120', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\127', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\171', '\131', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\122', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\167', '\165', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\152', '\102', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\162', '\124', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\167', '\112', '\040', '\166', '\141', '\040', '\061', + '\012', '\144', '\126', '\152', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\166', '\127', '\040', '\166', '\141', '\040', '\061', + '\012', '\144', '\132', '\153', '\040', '\144', '\145', '\040', '\061', + '\012', '\156', '\162', '\107', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\163', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\120', '\166', '\163', '\040', '\166', '\141', '\040', '\061', + '\012', '\154', '\114', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\103', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\166', '\126', '\040', '\144', '\145', '\040', '\061', + '\012', '\120', '\152', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\113', '\155', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\112', '\146', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\167', '\131', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\167', '\103', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\107', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\127', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\160', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\113', '\153', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\127', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\152', '\155', '\116', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\160', '\126', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\172', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\132', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\155', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\116', '\153', '\040', '\155', '\145', '\040', '\061', + '\012', '\171', '\160', '\115', '\040', '\160', '\162', '\040', '\061', + '\012', '\154', '\167', '\110', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\110', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\172', '\103', '\040', '\152', '\157', '\040', '\061', + '\012', '\157', '\112', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\114', '\161', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\130', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\105', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\165', '\127', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\166', '\124', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\163', '\107', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\123', '\170', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\113', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\171', '\145', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\110', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\103', '\167', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\172', '\155', '\112', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\165', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\144', '\110', '\040', '\144', '\145', '\040', '\061', + '\012', '\120', '\142', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\144', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\126', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\161', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\116', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\172', '\116', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\152', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\150', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\160', '\112', '\040', '\160', '\162', '\040', '\061', + '\012', '\170', '\115', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\124', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\164', '\114', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\147', '\122', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\121', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\122', '\152', '\160', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\150', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\103', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\142', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\170', '\121', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\126', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\153', '\131', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\120', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\121', '\153', '\040', '\151', '\152', '\040', '\061', + '\012', '\117', '\166', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\126', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\155', '\125', '\040', '\155', '\145', '\040', '\061', + '\012', '\165', '\106', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\141', '\132', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\107', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\147', '\111', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\124', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\166', '\103', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\107', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\162', '\116', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\121', '\164', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\116', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\120', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\112', '\144', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\144', '\152', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\151', '\167', '\131', '\040', '\164', '\151', '\040', '\061', + '\012', '\116', '\155', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\124', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\161', '\172', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\152', '\101', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\166', '\110', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\114', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\127', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\126', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\121', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\166', '\131', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\114', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\161', '\172', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\104', '\170', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\165', '\172', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\126', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\132', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\107', '\160', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\170', '\161', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\143', '\130', '\040', '\143', '\150', '\040', '\061', + '\012', '\110', '\170', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\164', '\125', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\113', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\151', '\107', '\170', '\040', '\164', '\151', '\040', '\061', + '\012', '\170', '\166', '\121', '\040', '\166', '\141', '\040', '\061', + '\012', '\154', '\170', '\101', '\040', '\154', '\145', '\040', '\061', + '\012', '\163', '\152', '\110', '\040', '\163', '\164', '\040', '\061', + '\012', '\107', '\161', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\147', '\121', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\104', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\132', '\156', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\146', '\125', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\165', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\121', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\150', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\114', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\144', '\131', '\040', '\144', '\145', '\040', '\061', + '\012', '\162', '\132', '\142', '\040', '\145', '\162', '\040', '\061', + '\012', '\153', '\104', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\163', '\113', '\040', '\163', '\172', '\040', '\061', + '\012', '\113', '\161', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\127', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\155', '\126', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\155', '\143', '\126', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\104', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\101', '\157', '\040', '\154', '\145', '\040', '\061', + '\012', '\146', '\172', '\122', '\040', '\163', '\172', '\040', '\061', + '\012', '\130', '\162', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\162', '\132', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\155', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\156', '\160', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\150', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\161', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\127', '\156', '\040', '\144', '\145', '\040', '\061', + '\012', '\127', '\155', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\122', '\147', '\171', '\040', '\156', '\147', '\040', '\061', + '\012', '\165', '\166', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\151', '\131', '\040', '\164', '\151', '\040', '\061', + '\012', '\170', '\127', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\112', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\157', '\110', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\166', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\131', '\144', '\156', '\040', '\144', '\145', '\040', '\061', + '\012', '\116', '\166', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\155', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\170', '\132', '\040', '\170', '\145', '\040', '\061', + '\012', '\130', '\144', '\146', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\131', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\156', '\166', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\116', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\127', '\156', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\167', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\127', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\121', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\126', '\170', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\170', '\167', '\107', '\040', '\167', '\141', '\040', '\061', + '\012', '\167', '\166', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\155', '\126', '\040', '\156', '\147', '\040', '\061', + '\012', '\122', '\172', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\103', '\160', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\107', '\171', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\170', '\172', '\101', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\107', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\142', '\161', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\150', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\120', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\151', '\161', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\152', '\113', '\040', '\144', '\145', '\040', '\061', + '\012', '\143', '\126', '\153', '\040', '\143', '\150', '\040', '\061', + '\012', '\162', '\167', '\124', '\040', '\145', '\162', '\040', '\061', + '\012', '\126', '\150', '\156', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\146', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\142', '\156', '\112', '\040', '\141', '\156', '\040', '\061', + '\012', '\103', '\160', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\116', '\155', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\156', '\117', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\127', '\143', '\040', '\161', '\165', '\040', '\061', + '\012', '\141', '\126', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\117', '\156', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\154', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\156', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\114', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\164', '\105', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\147', '\122', '\040', '\156', '\147', '\040', '\061', + '\012', '\131', '\161', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\110', '\167', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\156', '\127', '\153', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\161', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\101', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\150', '\132', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\113', '\172', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\116', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\124', '\153', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\165', '\131', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\143', '\122', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\116', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\153', '\110', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\142', '\112', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\152', '\152', '\104', '\040', '\151', '\152', '\040', '\061', + '\012', '\116', '\154', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\150', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\130', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\156', '\167', '\102', '\040', '\141', '\156', '\040', '\061', + '\012', '\110', '\172', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\121', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\113', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\126', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\154', '\125', '\040', '\154', '\145', '\040', '\061', + '\012', '\114', '\172', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\163', '\130', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\102', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\111', '\161', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\152', '\126', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\170', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\172', '\113', '\040', '\163', '\172', '\040', '\061', + '\012', '\162', '\104', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\165', '\121', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\107', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\142', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\125', '\157', '\040', '\153', '\141', '\040', '\061', + '\012', '\144', '\126', '\155', '\040', '\144', '\145', '\040', '\061', + '\012', '\104', '\144', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\161', '\103', '\040', '\166', '\157', '\040', '\061', + '\012', '\152', '\153', '\132', '\040', '\151', '\152', '\040', '\061', + '\012', '\114', '\166', '\172', '\040', '\166', '\141', '\040', '\061', + '\012', '\164', '\120', '\171', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\146', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\121', '\150', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\150', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\161', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\103', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\152', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\121', '\146', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\172', '\167', '\106', '\040', '\163', '\172', '\040', '\061', + '\012', '\106', '\167', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\160', '\166', '\125', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\150', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\124', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\154', '\121', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\172', '\114', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\161', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\164', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\150', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\152', '\102', '\040', '\151', '\152', '\040', '\061', + '\012', '\151', '\124', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\153', '\114', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\122', '\161', '\151', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\152', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\152', '\111', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\107', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\156', '\126', '\040', '\141', '\156', '\040', '\061', + '\012', '\154', '\121', '\170', '\040', '\154', '\145', '\040', '\061', + '\012', '\165', '\166', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\147', '\145', '\040', '\144', '\145', '\040', '\061', + '\012', '\147', '\112', '\166', '\040', '\156', '\147', '\040', '\061', + '\012', '\131', '\144', '\142', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\104', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\167', '\126', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\116', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\167', '\121', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\122', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\126', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\156', '\113', '\147', '\040', '\141', '\156', '\040', '\061', + '\012', '\124', '\147', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\131', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\154', '\102', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\152', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\101', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\155', '\113', '\040', '\155', '\145', '\040', '\061', + '\012', '\167', '\161', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\152', '\124', '\040', '\166', '\141', '\040', '\061', + '\012', '\114', '\161', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\156', '\103', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\172', '\131', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\161', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\107', '\142', '\040', '\155', '\145', '\040', '\061', + '\012', '\146', '\153', '\120', '\040', '\153', '\141', '\040', '\061', + '\012', '\167', '\121', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\106', '\161', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\126', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\127', '\143', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\160', '\131', '\040', '\167', '\141', '\040', '\061', + '\012', '\154', '\106', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\167', '\104', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\127', '\160', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\152', '\124', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\106', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\111', '\160', '\040', '\151', '\156', '\040', '\061', + '\012', '\164', '\142', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\161', '\143', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\153', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\145', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\120', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\167', '\114', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\110', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\170', '\167', '\120', '\040', '\167', '\141', '\040', '\061', + '\012', '\170', '\166', '\102', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\123', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\172', '\106', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\131', '\160', '\040', '\167', '\141', '\040', '\061', + '\012', '\144', '\104', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\156', '\102', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\116', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\125', '\142', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\170', '\130', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\122', '\154', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\102', '\172', '\040', '\144', '\145', '\040', '\061', + '\012', '\130', '\166', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\154', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\155', '\167', '\131', '\040', '\155', '\145', '\040', '\061', + '\012', '\167', '\150', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\115', '\172', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\101', '\161', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\104', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\152', '\132', '\040', '\143', '\150', '\040', '\061', + '\012', '\126', '\153', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\165', '\107', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\102', '\163', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\114', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\146', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\120', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\157', '\116', '\040', '\157', '\156', '\040', '\061', + '\012', '\131', '\144', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\114', '\170', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\143', '\143', '\132', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\112', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\126', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\162', '\105', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\147', '\120', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\120', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\145', '\165', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\132', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\156', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\102', '\147', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\154', '\121', '\040', '\154', '\145', '\040', '\061', + '\012', '\147', '\170', '\101', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\114', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\156', '\104', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\130', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\164', '\146', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\167', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\127', '\144', '\040', '\144', '\157', '\040', '\061', + '\012', '\170', '\156', '\110', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\117', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\114', '\153', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\116', '\166', '\171', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\111', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\153', '\113', '\040', '\153', '\141', '\040', '\061', + '\012', '\162', '\115', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\162', '\155', '\121', '\040', '\145', '\162', '\040', '\061', + '\012', '\142', '\120', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\101', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\121', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\110', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\120', '\155', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\172', '\112', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\124', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\127', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\132', '\167', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\113', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\107', '\142', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\115', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\116', '\146', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\146', '\101', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\144', '\110', '\142', '\040', '\144', '\145', '\040', '\061', + '\012', '\154', '\170', '\110', '\040', '\154', '\145', '\040', '\061', + '\012', '\144', '\161', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\124', '\154', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\152', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\111', '\171', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\157', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\150', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\115', '\152', '\040', '\154', '\145', '\040', '\061', + '\012', '\146', '\172', '\106', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\162', '\122', '\040', '\145', '\162', '\040', '\061', + '\012', '\171', '\116', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\141', '\120', '\166', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\167', '\107', '\040', '\167', '\141', '\040', '\061', + '\012', '\103', '\155', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\163', '\166', '\113', '\040', '\166', '\141', '\040', '\061', + '\012', '\163', '\162', '\117', '\040', '\145', '\162', '\040', '\061', + '\012', '\125', '\150', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\120', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\124', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\172', '\110', '\040', '\163', '\172', '\040', '\061', + '\012', '\111', '\157', '\170', '\040', '\157', '\156', '\040', '\061', + '\012', '\146', '\121', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\132', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\156', '\161', '\125', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\120', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\124', '\172', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\156', '\122', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\146', '\112', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\171', '\130', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\114', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\152', '\120', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\155', '\122', '\040', '\155', '\145', '\040', '\061', + '\012', '\145', '\120', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\171', '\124', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\152', '\120', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\163', '\110', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\167', '\102', '\040', '\166', '\141', '\040', '\061', + '\012', '\131', '\156', '\162', '\040', '\141', '\156', '\040', '\061', + '\012', '\124', '\161', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\114', '\166', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\164', '\103', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\160', '\102', '\040', '\167', '\141', '\040', '\061', + '\012', '\167', '\130', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\150', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\131', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\104', '\160', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\147', '\122', '\040', '\156', '\147', '\040', '\061', + '\012', '\122', '\146', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\112', '\171', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\170', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\120', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\141', '\117', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\132', '\167', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\146', '\106', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\142', '\104', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\113', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\110', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\150', '\162', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\106', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\114', '\170', '\040', '\154', '\145', '\040', '\061', + '\012', '\141', '\131', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\103', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\127', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\144', '\131', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\167', '\111', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\114', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\115', '\172', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\113', '\153', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\115', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\143', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\152', '\102', '\040', '\151', '\152', '\040', '\061', + '\012', '\115', '\161', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\170', '\127', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\132', '\166', '\040', '\156', '\147', '\040', '\061', + '\012', '\122', '\146', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\167', '\104', '\040', '\167', '\141', '\040', '\061', + '\012', '\154', '\150', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\126', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\146', '\127', '\040', '\166', '\141', '\040', '\061', + '\012', '\154', '\170', '\120', '\040', '\154', '\145', '\040', '\061', + '\012', '\131', '\171', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\150', '\120', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\125', '\170', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\144', '\117', '\040', '\144', '\145', '\040', '\061', + '\012', '\142', '\122', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\130', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\147', '\126', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\101', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\167', '\130', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\113', '\166', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\163', '\166', '\114', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\127', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\144', '\162', '\121', '\040', '\145', '\162', '\040', '\061', + '\012', '\114', '\160', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\113', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\145', '\103', '\166', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\167', '\110', '\040', '\167', '\141', '\040', '\061', + '\012', '\143', '\166', '\103', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\125', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\157', '\120', '\170', '\040', '\157', '\156', '\040', '\061', + '\012', '\164', '\152', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\102', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\166', '\160', '\111', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\172', '\131', '\040', '\156', '\147', '\040', '\061', + '\012', '\157', '\132', '\163', '\040', '\157', '\156', '\040', '\061', + '\012', '\160', '\113', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\113', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\143', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\146', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\163', '\166', '\115', '\040', '\166', '\141', '\040', '\061', + '\012', '\126', '\152', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\154', '\126', '\167', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\127', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\130', '\160', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\154', '\143', '\101', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\114', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\104', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\130', '\152', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\144', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\113', '\155', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\156', '\127', '\040', '\141', '\156', '\040', '\061', + '\012', '\124', '\143', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\147', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\132', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\145', '\112', '\166', '\040', '\145', '\162', '\040', '\061', + '\012', '\131', '\170', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\153', '\146', '\115', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\113', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\115', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\144', '\147', '\131', '\040', '\144', '\145', '\040', '\061', + '\012', '\147', '\107', '\144', '\040', '\156', '\147', '\040', '\061', + '\012', '\126', '\143', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\123', '\146', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\170', '\104', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\124', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\122', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\117', '\141', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\165', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\147', '\112', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\122', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\153', '\131', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\167', '\104', '\040', '\167', '\141', '\040', '\061', + '\012', '\166', '\130', '\163', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\154', '\103', '\040', '\154', '\145', '\040', '\061', + '\012', '\153', '\155', '\110', '\040', '\153', '\141', '\040', '\061', + '\012', '\152', '\150', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\170', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\166', '\164', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\127', '\155', '\040', '\151', '\156', '\040', '\061', + '\012', '\161', '\126', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\110', '\152', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\120', '\170', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\131', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\167', '\147', '\107', '\040', '\156', '\147', '\040', '\061', + '\012', '\112', '\166', '\163', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\110', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\113', '\172', '\171', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\152', '\111', '\040', '\151', '\152', '\040', '\061', + '\012', '\165', '\126', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\120', '\172', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\170', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\120', '\171', '\040', '\167', '\141', '\040', '\061', + '\012', '\142', '\130', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\172', '\131', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\161', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\170', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\146', '\102', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\120', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\142', '\160', '\103', '\040', '\160', '\162', '\040', '\061', + '\012', '\150', '\106', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\103', '\161', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\167', '\111', '\040', '\144', '\145', '\040', '\061', + '\012', '\124', '\143', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\132', '\152', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\117', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\112', '\146', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\151', '\132', '\162', '\040', '\151', '\156', '\040', '\061', + '\012', '\126', '\170', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\114', '\160', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\146', '\110', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\106', '\171', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\143', '\104', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\115', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\171', '\125', '\040', '\156', '\171', '\040', '\061', + '\012', '\155', '\107', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\112', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\113', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\115', '\155', '\040', '\154', '\145', '\040', '\061', + '\012', '\155', '\161', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\110', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\154', '\107', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\145', '\111', '\152', '\040', '\164', '\145', '\040', '\061', + '\012', '\126', '\144', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\103', '\153', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\121', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\131', '\167', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\172', '\125', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\132', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\116', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\104', '\170', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\131', '\162', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\113', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\104', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\156', '\106', '\040', '\141', '\156', '\040', '\061', + '\012', '\114', '\163', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\110', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\103', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\156', '\130', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\102', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\152', '\126', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\117', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\161', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\146', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\143', '\152', '\123', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\146', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\166', '\111', '\040', '\166', '\141', '\040', '\061', + '\012', '\117', '\167', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\147', '\130', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\157', '\103', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\115', '\162', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\111', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\112', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\161', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\161', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\120', '\172', '\040', '\145', '\162', '\040', '\061', + '\012', '\151', '\167', '\127', '\040', '\151', '\156', '\040', '\061', + '\012', '\143', '\115', '\160', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\126', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\124', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\111', '\167', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\170', '\154', '\132', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\152', '\121', '\040', '\166', '\141', '\040', '\061', + '\012', '\151', '\120', '\142', '\040', '\151', '\156', '\040', '\061', + '\012', '\127', '\150', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\166', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\172', '\104', '\040', '\163', '\172', '\040', '\061', + '\012', '\110', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\161', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\150', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\162', '\122', '\040', '\145', '\162', '\040', '\061', + '\012', '\156', '\154', '\126', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\131', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\126', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\160', '\117', '\040', '\166', '\141', '\040', '\061', + '\012', '\122', '\166', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\163', '\143', '\131', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\144', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\114', '\153', '\040', '\166', '\141', '\040', '\061', + '\012', '\163', '\166', '\111', '\040', '\166', '\141', '\040', '\061', + '\012', '\155', '\144', '\105', '\040', '\144', '\145', '\040', '\061', + '\012', '\150', '\102', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\162', '\166', '\040', '\145', '\162', '\040', '\061', + '\012', '\152', '\127', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\124', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\131', '\160', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\115', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\144', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\143', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\103', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\146', '\126', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\141', '\120', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\160', '\125', '\040', '\160', '\162', '\040', '\061', + '\012', '\126', '\153', '\142', '\040', '\153', '\141', '\040', '\061', + '\012', '\164', '\142', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\121', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\170', '\126', '\040', '\156', '\147', '\040', '\061', + '\012', '\123', '\146', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\131', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\147', '\127', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\105', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\155', '\130', '\171', '\040', '\155', '\145', '\040', '\061', + '\012', '\154', '\156', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\155', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\153', '\171', '\040', '\153', '\141', '\040', '\061', + '\012', '\167', '\167', '\130', '\040', '\167', '\141', '\040', '\061', + '\012', '\125', '\167', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\143', '\146', '\102', '\040', '\143', '\150', '\040', '\061', + '\012', '\107', '\170', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\146', '\160', '\114', '\040', '\160', '\162', '\040', '\061', + '\012', '\152', '\124', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\132', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\154', '\113', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\102', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\161', '\151', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\107', '\163', '\040', '\154', '\145', '\040', '\061', + '\012', '\104', '\161', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\147', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\103', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\116', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\161', '\112', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\154', '\104', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\130', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\130', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\153', '\150', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\132', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\123', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\152', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\110', '\167', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\146', '\130', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\147', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\144', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\150', '\143', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\112', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\143', '\155', '\121', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\166', '\126', '\040', '\166', '\141', '\040', '\061', + '\012', '\116', '\161', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\170', '\123', '\040', '\163', '\172', '\040', '\061', + '\012', '\153', '\107', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\106', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\172', '\115', '\040', '\163', '\172', '\040', '\061', + '\012', '\130', '\162', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\144', '\143', '\112', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\121', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\116', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\170', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\167', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\102', '\161', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\162', '\113', '\040', '\145', '\162', '\040', '\061', + '\012', '\172', '\144', '\103', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\101', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\144', '\114', '\164', '\040', '\163', '\164', '\040', '\061', + '\012', '\160', '\147', '\106', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\147', '\127', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\160', '\116', '\040', '\166', '\141', '\040', '\061', + '\012', '\111', '\166', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\131', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\122', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\120', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\117', '\161', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\152', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\160', '\110', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\104', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\170', '\146', '\112', '\040', '\146', '\157', '\040', '\061', + '\012', '\146', '\161', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\145', '\102', '\146', '\040', '\145', '\162', '\040', '\061', + '\012', '\132', '\153', '\167', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\110', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\101', '\161', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\116', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\146', '\152', '\130', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\161', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\152', '\113', '\040', '\154', '\145', '\040', '\061', + '\012', '\107', '\153', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\142', '\123', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\115', '\170', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\104', '\161', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\113', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\106', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\155', '\112', '\040', '\155', '\145', '\040', '\061', + '\012', '\166', '\172', '\124', '\040', '\166', '\141', '\040', '\061', + '\012', '\162', '\150', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\110', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\112', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\161', '\127', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\166', '\153', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\153', '\102', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\105', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\125', '\147', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\121', '\155', '\171', '\040', '\155', '\145', '\040', '\061', + '\012', '\114', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\107', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\154', '\110', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\107', '\147', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\106', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\156', '\126', '\040', '\141', '\156', '\040', '\061', + '\012', '\145', '\106', '\171', '\040', '\145', '\162', '\040', '\061', + '\012', '\116', '\146', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\150', '\123', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\130', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\110', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\165', '\161', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\130', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\143', '\124', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\112', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\127', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\161', '\160', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\161', '\105', '\040', '\164', '\150', '\040', '\061', + '\012', '\131', '\146', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\162', '\111', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\147', '\113', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\171', '\120', '\040', '\156', '\171', '\040', '\061', + '\012', '\132', '\155', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\114', '\153', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\145', '\125', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\162', '\131', '\040', '\145', '\162', '\040', '\061', + '\012', '\153', '\106', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\163', '\125', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\154', '\132', '\040', '\154', '\145', '\040', '\061', + '\012', '\143', '\156', '\126', '\040', '\143', '\150', '\040', '\061', + '\012', '\141', '\120', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\152', '\105', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\132', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\165', '\106', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\113', '\156', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\106', '\160', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\146', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\156', '\103', '\040', '\141', '\156', '\040', '\061', + '\012', '\104', '\154', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\162', '\115', '\040', '\145', '\162', '\040', '\061', + '\012', '\163', '\146', '\102', '\040', '\163', '\172', '\040', '\061', + '\012', '\107', '\170', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\106', '\153', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\107', '\153', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\122', '\155', '\040', '\156', '\147', '\040', '\061', + '\012', '\162', '\127', '\146', '\040', '\145', '\162', '\040', '\061', + '\012', '\162', '\131', '\166', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\105', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\110', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\123', '\155', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\154', '\106', '\160', '\040', '\154', '\145', '\040', '\061', + '\012', '\153', '\104', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\123', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\162', '\114', '\167', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\156', '\132', '\040', '\141', '\156', '\040', '\061', + '\012', '\127', '\152', '\160', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\124', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\113', '\143', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\113', '\163', '\040', '\166', '\141', '\040', '\061', + '\012', '\142', '\143', '\113', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\167', '\171', '\040', '\166', '\141', '\040', '\061', + '\012', '\125', '\152', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\121', '\166', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\144', '\143', '\126', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\126', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\165', '\111', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\154', '\116', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\167', '\114', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\127', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\120', '\170', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\162', '\122', '\142', '\040', '\145', '\162', '\040', '\061', + '\012', '\142', '\146', '\104', '\040', '\142', '\145', '\040', '\061', + '\012', '\171', '\103', '\170', '\040', '\156', '\171', '\040', '\061', + '\012', '\156', '\112', '\163', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\103', '\155', '\040', '\144', '\145', '\040', '\061', + '\012', '\143', '\142', '\107', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\103', '\146', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\155', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\145', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\156', '\123', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\167', '\131', '\040', '\156', '\147', '\040', '\061', + '\012', '\127', '\152', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\155', '\111', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\152', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\167', '\166', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\112', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\143', '\156', '\101', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\102', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\147', '\106', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\104', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\147', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\125', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\104', '\156', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\110', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\167', '\130', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\171', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\153', '\104', '\040', '\153', '\141', '\040', '\061', + '\012', '\163', '\114', '\172', '\040', '\163', '\164', '\040', '\061', + '\012', '\172', '\170', '\106', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\115', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\154', '\122', '\040', '\154', '\145', '\040', '\061', + '\012', '\160', '\167', '\132', '\040', '\160', '\162', '\040', '\061', + '\012', '\160', '\131', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\146', '\114', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\164', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\124', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\144', '\103', '\160', '\040', '\144', '\145', '\040', '\061', + '\012', '\142', '\167', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\170', '\103', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\146', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\114', '\156', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\131', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\160', '\127', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\111', '\170', '\040', '\157', '\156', '\040', '\061', + '\012', '\171', '\167', '\105', '\040', '\167', '\141', '\040', '\061', + '\012', '\167', '\116', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\152', '\167', '\117', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\132', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\107', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\143', '\126', '\167', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\152', '\113', '\040', '\151', '\152', '\040', '\061', + '\012', '\107', '\172', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\167', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\102', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\124', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\162', '\110', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\163', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\105', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\162', '\113', '\040', '\145', '\162', '\040', '\061', + '\012', '\155', '\115', '\142', '\040', '\155', '\145', '\040', '\061', + '\012', '\160', '\110', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\143', '\152', '\116', '\040', '\143', '\150', '\040', '\061', + '\012', '\156', '\130', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\167', '\117', '\040', '\167', '\141', '\040', '\061', + '\012', '\146', '\154', '\102', '\040', '\154', '\145', '\040', '\061', + '\012', '\121', '\161', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\113', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\106', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\146', '\107', '\040', '\167', '\141', '\040', '\061', + '\012', '\167', '\146', '\102', '\040', '\167', '\141', '\040', '\061', + '\012', '\112', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\167', '\113', '\040', '\167', '\141', '\040', '\061', + '\012', '\150', '\150', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\125', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\106', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\153', '\124', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\114', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\150', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\155', '\126', '\040', '\155', '\145', '\040', '\061', + '\012', '\164', '\155', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\122', '\164', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\171', '\131', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\171', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\122', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\130', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\132', '\156', '\172', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\161', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\115', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\167', '\126', '\040', '\156', '\147', '\040', '\061', + '\012', '\120', '\142', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\143', '\115', '\040', '\143', '\150', '\040', '\061', + '\012', '\156', '\120', '\172', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\167', '\125', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\112', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\171', '\121', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\130', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\142', '\163', '\132', '\040', '\163', '\172', '\040', '\061', + '\012', '\102', '\161', '\151', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\107', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\156', '\116', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\131', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\124', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\155', '\120', '\040', '\155', '\145', '\040', '\061', + '\012', '\152', '\160', '\132', '\040', '\151', '\152', '\040', '\061', + '\012', '\115', '\161', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\152', '\115', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\126', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\165', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\102', '\153', '\040', '\145', '\162', '\040', '\061', + '\012', '\152', '\165', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\105', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\127', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\172', '\110', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\114', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\116', '\143', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\146', '\116', '\040', '\153', '\141', '\040', '\061', + '\012', '\165', '\125', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\103', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\103', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\125', '\171', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\102', '\146', '\040', '\160', '\162', '\040', '\061', + '\012', '\152', '\102', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\104', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\155', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\164', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\143', '\123', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\120', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\121', '\155', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\172', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\143', '\114', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\162', '\111', '\040', '\145', '\162', '\040', '\061', + '\012', '\144', '\166', '\116', '\040', '\166', '\141', '\040', '\061', + '\012', '\103', '\167', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\150', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\107', '\172', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\144', '\117', '\040', '\144', '\145', '\040', '\061', + '\012', '\102', '\161', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\114', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\154', '\170', '\146', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\131', '\153', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\123', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\153', '\123', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\113', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\120', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\120', '\155', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\154', '\127', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\165', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\143', '\130', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\172', '\121', '\040', '\163', '\172', '\040', '\061', + '\012', '\107', '\172', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\145', '\120', '\155', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\167', '\127', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\167', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\121', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\170', '\120', '\040', '\142', '\145', '\040', '\061', + '\012', '\144', '\155', '\104', '\040', '\144', '\145', '\040', '\061', + '\012', '\141', '\167', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\126', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\142', '\167', '\131', '\040', '\167', '\141', '\040', '\061', + '\012', '\132', '\170', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\150', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\131', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\103', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\146', '\121', '\040', '\156', '\171', '\040', '\061', + '\012', '\172', '\107', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\166', '\105', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\103', '\166', '\040', '\156', '\147', '\040', '\061', + '\012', '\157', '\120', '\146', '\040', '\157', '\156', '\040', '\061', + '\012', '\172', '\130', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\150', '\166', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\172', '\123', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\146', '\130', '\040', '\155', '\145', '\040', '\061', + '\012', '\144', '\120', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\114', '\162', '\146', '\040', '\145', '\162', '\040', '\061', + '\012', '\154', '\162', '\107', '\040', '\145', '\162', '\040', '\061', + '\012', '\155', '\131', '\146', '\040', '\155', '\145', '\040', '\061', + '\012', '\150', '\116', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\101', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\170', '\121', '\040', '\163', '\164', '\040', '\061', + '\012', '\153', '\124', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\117', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\144', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\167', '\113', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\121', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\104', '\161', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\127', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\170', '\105', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\130', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\156', '\166', '\102', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\130', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\103', '\161', '\151', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\172', '\127', '\040', '\163', '\172', '\040', '\061', + '\012', '\162', '\122', '\146', '\040', '\145', '\162', '\040', '\061', + '\012', '\155', '\132', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\156', '\106', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\141', '\107', '\040', '\141', '\156', '\040', '\061', + '\012', '\102', '\161', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\115', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\110', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\114', '\152', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\115', '\167', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\160', '\172', '\113', '\040', '\163', '\172', '\040', '\061', + '\012', '\155', '\120', '\142', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\152', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\122', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\132', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\156', '\161', '\107', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\126', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\152', '\103', '\040', '\151', '\152', '\040', '\061', + '\012', '\165', '\110', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\104', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\161', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\147', '\125', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\112', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\172', '\156', '\113', '\040', '\141', '\156', '\040', '\061', + '\012', '\162', '\150', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\104', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\112', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\153', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\156', '\112', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\122', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\172', '\101', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\121', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\124', '\170', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\142', '\153', '\107', '\040', '\153', '\141', '\040', '\061', + '\012', '\171', '\167', '\132', '\040', '\167', '\141', '\040', '\061', + '\012', '\172', '\127', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\150', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\155', '\106', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\146', '\121', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\155', '\107', '\040', '\163', '\172', '\040', '\061', + '\012', '\117', '\147', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\165', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\101', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\104', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\126', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\122', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\170', '\155', '\115', '\040', '\155', '\145', '\040', '\061', + '\012', '\160', '\170', '\102', '\040', '\160', '\162', '\040', '\061', + '\012', '\172', '\164', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\172', '\112', '\040', '\163', '\172', '\040', '\061', + '\012', '\156', '\106', '\172', '\040', '\141', '\156', '\040', '\061', + '\012', '\165', '\126', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\156', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\107', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\144', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\126', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\115', '\150', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\161', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\110', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\167', '\103', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\153', '\107', '\040', '\166', '\141', '\040', '\061', + '\012', '\130', '\153', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\164', '\122', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\166', '\126', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\167', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\150', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\167', '\117', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\121', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\162', '\122', '\040', '\143', '\150', '\040', '\061', + '\012', '\115', '\162', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\121', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\155', '\102', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\125', '\171', '\040', '\166', '\141', '\040', '\061', + '\012', '\164', '\167', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\147', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\116', '\170', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\150', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\160', '\130', '\040', '\160', '\162', '\040', '\061', + '\012', '\146', '\166', '\104', '\040', '\166', '\141', '\040', '\061', + '\012', '\103', '\166', '\171', '\040', '\166', '\141', '\040', '\061', + '\012', '\157', '\110', '\152', '\040', '\157', '\156', '\040', '\061', + '\012', '\121', '\161', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\131', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\150', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\132', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\171', '\113', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\170', '\131', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\143', '\125', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\105', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\130', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\155', '\154', '\121', '\040', '\154', '\145', '\040', '\061', + '\012', '\107', '\147', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\114', '\160', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\170', '\125', '\040', '\156', '\171', '\040', '\061', + '\012', '\147', '\166', '\112', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\161', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\163', '\116', '\040', '\163', '\172', '\040', '\061', + '\012', '\111', '\152', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\142', '\112', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\115', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\153', '\130', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\162', '\124', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\117', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\160', '\107', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\107', '\153', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\103', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\161', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\104', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\156', '\121', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\144', '\126', '\040', '\144', '\145', '\040', '\061', + '\012', '\142', '\147', '\123', '\040', '\156', '\147', '\040', '\061', + '\012', '\124', '\161', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\105', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\150', '\132', '\163', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\131', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\120', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\150', '\147', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\120', '\166', '\171', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\170', '\113', '\040', '\146', '\157', '\040', '\061', + '\012', '\110', '\167', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\170', '\122', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\144', '\155', '\120', '\040', '\144', '\145', '\040', '\061', + '\012', '\155', '\143', '\131', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\170', '\122', '\040', '\142', '\145', '\040', '\061', + '\012', '\114', '\163', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\122', '\154', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\167', '\121', '\040', '\151', '\156', '\040', '\061', + '\012', '\127', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\146', '\126', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\167', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\160', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\155', '\162', '\117', '\040', '\145', '\162', '\040', '\061', + '\012', '\151', '\106', '\143', '\040', '\164', '\151', '\040', '\061', + '\012', '\167', '\172', '\104', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\142', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\146', '\123', '\040', '\146', '\157', '\040', '\061', + '\012', '\120', '\161', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\131', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\154', '\104', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\164', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\172', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\152', '\113', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\104', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\156', '\103', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\103', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\170', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\115', '\166', '\040', '\157', '\156', '\040', '\061', + '\012', '\143', '\147', '\131', '\040', '\143', '\150', '\040', '\061', + '\012', '\127', '\161', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\153', '\121', '\040', '\153', '\141', '\040', '\061', + '\012', '\164', '\161', '\117', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\156', '\103', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\107', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\102', '\146', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\131', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\160', '\143', '\114', '\040', '\143', '\150', '\040', '\061', + '\012', '\106', '\147', '\160', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\164', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\150', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\125', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\156', '\116', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\124', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\163', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\141', '\112', '\147', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\121', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\107', '\156', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\155', '\115', '\040', '\155', '\145', '\040', '\061', + '\012', '\172', '\161', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\152', '\132', '\040', '\156', '\147', '\040', '\061', + '\012', '\156', '\170', '\110', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\144', '\117', '\040', '\143', '\150', '\040', '\061', + '\012', '\141', '\101', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\125', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\130', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\102', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\147', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\132', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\112', '\153', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\160', '\166', '\104', '\040', '\166', '\141', '\040', '\061', + '\012', '\142', '\155', '\124', '\040', '\155', '\145', '\040', '\061', + '\012', '\157', '\131', '\170', '\040', '\157', '\156', '\040', '\061', + '\012', '\150', '\167', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\152', '\102', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\131', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\151', '\110', '\170', '\040', '\151', '\156', '\040', '\061', + '\012', '\154', '\131', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\103', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\146', '\150', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\104', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\103', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\170', '\102', '\040', '\154', '\145', '\040', '\061', + '\012', '\145', '\130', '\152', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\166', '\127', '\040', '\166', '\141', '\040', '\061', + '\012', '\143', '\143', '\127', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\124', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\161', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\116', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\153', '\115', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\122', '\166', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\156', '\111', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\167', '\103', '\040', '\167', '\141', '\040', '\061', + '\012', '\172', '\161', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\121', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\170', '\162', '\103', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\106', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\157', '\145', '\121', '\040', '\145', '\162', '\040', '\061', + '\012', '\155', '\114', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\167', '\124', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\167', '\104', '\040', '\167', '\141', '\040', '\061', + '\012', '\166', '\160', '\105', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\154', '\131', '\040', '\154', '\145', '\040', '\061', + '\012', '\163', '\122', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\123', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\165', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\162', '\111', '\040', '\145', '\162', '\040', '\061', + '\012', '\131', '\163', '\156', '\040', '\163', '\164', '\040', '\061', + '\012', '\126', '\150', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\103', '\161', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\131', '\147', '\142', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\120', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\153', '\102', '\040', '\153', '\141', '\040', '\061', + '\012', '\164', '\122', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\141', '\152', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\143', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\104', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\121', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\145', '\125', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\143', '\115', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\126', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\122', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\106', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\142', '\127', '\040', '\142', '\145', '\040', '\061', + '\012', '\165', '\125', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\116', '\150', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\131', '\153', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\127', '\164', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\115', '\172', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\156', '\160', '\124', '\040', '\151', '\156', '\040', '\061', + '\012', '\130', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\167', '\116', '\040', '\167', '\141', '\040', '\061', + '\012', '\150', '\130', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\114', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\107', '\170', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\144', '\104', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\102', '\146', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\146', '\153', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\152', '\117', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\104', '\144', '\153', '\040', '\144', '\145', '\040', '\061', + '\012', '\116', '\152', '\160', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\152', '\112', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\150', '\123', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\167', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\171', '\127', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\156', '\106', '\166', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\114', '\142', '\040', '\160', '\162', '\040', '\061', + '\012', '\161', '\142', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\155', '\130', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\156', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\121', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\172', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\116', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\160', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\102', '\170', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\147', '\107', '\040', '\156', '\147', '\040', '\061', + '\012', '\122', '\154', '\152', '\040', '\154', '\145', '\040', '\061', + '\012', '\151', '\110', '\161', '\040', '\151', '\156', '\040', '\061', + '\012', '\163', '\167', '\116', '\040', '\163', '\172', '\040', '\061', + '\012', '\116', '\152', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\120', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\157', '\122', '\166', '\040', '\157', '\156', '\040', '\061', + '\012', '\160', '\112', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\153', '\132', '\167', '\040', '\153', '\141', '\040', '\061', + '\012', '\166', '\126', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\126', '\142', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\106', '\146', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\172', '\121', '\040', '\163', '\172', '\040', '\061', + '\012', '\107', '\166', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\120', '\147', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\120', '\160', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\103', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\153', '\116', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\142', '\155', '\104', '\040', '\155', '\145', '\040', '\061', + '\012', '\155', '\127', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\154', '\106', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\151', '\130', '\040', '\151', '\156', '\040', '\061', + '\012', '\171', '\122', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\154', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\146', '\132', '\040', '\163', '\172', '\040', '\061', + '\012', '\127', '\146', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\166', '\162', '\117', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\170', '\124', '\040', '\156', '\147', '\040', '\061', + '\012', '\154', '\167', '\105', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\144', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\160', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\121', '\160', '\146', '\040', '\160', '\162', '\040', '\061', + '\012', '\132', '\156', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\146', '\112', '\040', '\142', '\145', '\040', '\061', + '\012', '\161', '\121', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\101', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\141', '\161', '\127', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\161', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\167', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\116', '\156', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\114', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\127', '\164', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\143', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\152', '\122', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\127', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\132', '\155', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\132', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\131', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\126', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\130', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\167', '\112', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\167', '\132', '\040', '\151', '\152', '\040', '\061', + '\012', '\154', '\167', '\114', '\040', '\154', '\145', '\040', '\061', + '\012', '\145', '\107', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\123', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\102', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\163', '\123', '\040', '\163', '\172', '\040', '\061', + '\012', '\153', '\156', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\116', '\156', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\155', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\123', '\161', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\146', '\121', '\040', '\146', '\157', '\040', '\061', + '\012', '\126', '\143', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\155', '\104', '\040', '\155', '\145', '\040', '\061', + '\012', '\172', '\131', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\101', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\156', '\142', '\127', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\112', '\155', '\040', '\156', '\147', '\040', '\061', + '\012', '\112', '\167', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\170', '\112', '\040', '\155', '\145', '\040', '\061', + '\012', '\170', '\142', '\103', '\040', '\142', '\145', '\040', '\061', + '\012', '\122', '\142', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\132', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\112', '\171', '\040', '\142', '\145', '\040', '\061', + '\012', '\130', '\171', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\153', '\126', '\040', '\163', '\172', '\040', '\061', + '\012', '\165', '\157', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\143', '\125', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\132', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\162', '\120', '\155', '\040', '\145', '\162', '\040', '\061', + '\012', '\162', '\107', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\154', '\143', '\114', '\040', '\143', '\150', '\040', '\061', + '\012', '\162', '\126', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\103', '\147', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\103', '\164', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\145', '\107', '\166', '\040', '\145', '\162', '\040', '\061', + '\012', '\122', '\172', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\121', '\150', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\114', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\126', '\161', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\144', '\112', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\126', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\164', '\114', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\146', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\170', '\126', '\040', '\167', '\141', '\040', '\061', + '\012', '\171', '\122', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\170', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\131', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\150', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\114', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\132', '\166', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\166', '\155', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\143', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\115', '\167', '\160', '\040', '\167', '\141', '\040', '\061', + '\012', '\143', '\124', '\147', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\130', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\121', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\112', '\142', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\171', '\146', '\107', '\040', '\156', '\171', '\040', '\061', + '\012', '\160', '\150', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\152', '\110', '\040', '\156', '\147', '\040', '\061', + '\012', '\127', '\144', '\147', '\040', '\144', '\145', '\040', '\061', + '\012', '\160', '\120', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\102', '\167', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\156', '\102', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\167', '\112', '\040', '\167', '\141', '\040', '\061', + '\012', '\165', '\164', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\152', '\103', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\126', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\143', '\124', '\155', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\115', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\113', '\147', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\156', '\122', '\144', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\115', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\152', '\121', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\131', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\131', '\152', '\040', '\163', '\164', '\040', '\061', + '\012', '\152', '\116', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\130', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\172', '\102', '\040', '\163', '\172', '\040', '\061', + '\012', '\123', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\164', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\131', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\147', '\154', '\124', '\040', '\156', '\147', '\040', '\061', + '\012', '\125', '\165', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\165', '\117', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\151', '\102', '\170', '\040', '\151', '\156', '\040', '\061', + '\012', '\122', '\161', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\127', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\110', '\143', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\116', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\121', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\151', '\110', '\144', '\040', '\151', '\156', '\040', '\061', + '\012', '\127', '\160', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\156', '\146', '\131', '\040', '\141', '\156', '\040', '\061', + '\012', '\122', '\153', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\113', '\161', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\146', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\153', '\162', '\103', '\040', '\145', '\162', '\040', '\061', + '\012', '\127', '\150', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\152', '\115', '\040', '\154', '\145', '\040', '\061', + '\012', '\171', '\170', '\107', '\040', '\156', '\171', '\040', '\061', + '\012', '\146', '\160', '\127', '\040', '\160', '\162', '\040', '\061', + '\012', '\142', '\143', '\106', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\162', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\165', '\104', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\172', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\167', '\120', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\114', '\146', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\102', '\153', '\160', '\040', '\153', '\141', '\040', '\061', + '\012', '\130', '\153', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\170', '\110', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\111', '\152', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\124', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\105', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\161', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\154', '\104', '\040', '\154', '\145', '\040', '\061', + '\012', '\164', '\106', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\116', '\146', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\106', '\161', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\124', '\172', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\163', '\112', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\111', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\106', '\142', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\172', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\126', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\126', '\161', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\161', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\144', '\112', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\111', '\160', '\040', '\144', '\145', '\040', '\061', + '\012', '\132', '\156', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\153', '\113', '\040', '\151', '\152', '\040', '\061', + '\012', '\162', '\146', '\121', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\153', '\111', '\040', '\153', '\165', '\040', '\061', + '\012', '\146', '\111', '\157', '\040', '\162', '\157', '\040', '\061', + '\012', '\154', '\161', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\160', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\160', '\101', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\162', '\162', '\121', '\040', '\145', '\162', '\040', '\061', + '\012', '\142', '\111', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\104', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\157', '\110', '\170', '\040', '\157', '\156', '\040', '\061', + '\012', '\167', '\112', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\103', '\161', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\166', '\102', '\040', '\166', '\141', '\040', '\061', + '\012', '\171', '\161', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\114', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\106', '\172', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\132', '\146', '\040', '\144', '\145', '\040', '\061', + '\012', '\116', '\161', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\122', '\156', '\172', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\124', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\126', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\106', '\144', '\155', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\146', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\167', '\123', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\120', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\107', '\170', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\106', '\166', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\132', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\172', '\126', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\155', '\102', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\130', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\120', '\154', '\167', '\040', '\154', '\145', '\040', '\061', + '\012', '\116', '\154', '\170', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\103', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\113', '\167', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\112', '\161', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\107', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\165', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\172', '\114', '\040', '\163', '\172', '\040', '\061', + '\012', '\151', '\106', '\170', '\040', '\151', '\156', '\040', '\061', + '\012', '\146', '\124', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\171', '\127', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\143', '\110', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\106', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\155', '\161', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\141', '\121', '\153', '\040', '\141', '\156', '\040', '\061', + '\012', '\165', '\104', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\142', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\160', '\147', '\112', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\153', '\116', '\040', '\153', '\141', '\040', '\061', + '\012', '\160', '\102', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\102', '\144', '\166', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\155', '\127', '\040', '\151', '\152', '\040', '\061', + '\012', '\112', '\166', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\130', '\160', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\121', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\144', '\107', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\153', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\123', '\144', '\040', '\143', '\150', '\040', '\061', + '\012', '\106', '\144', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\147', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\144', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\116', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\145', '\126', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\146', '\101', '\040', '\144', '\145', '\040', '\061', + '\012', '\110', '\172', '\171', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\127', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\170', '\110', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\170', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\113', '\150', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\121', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\160', '\167', '\124', '\040', '\160', '\162', '\040', '\061', + '\012', '\114', '\167', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\172', '\104', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\170', '\113', '\040', '\153', '\141', '\040', '\061', + '\012', '\155', '\164', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\150', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\167', '\122', '\040', '\167', '\141', '\040', '\061', + '\012', '\152', '\111', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\127', '\172', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\161', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\154', '\132', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\115', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\167', '\160', '\122', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\110', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\141', '\117', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\153', '\125', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\122', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\152', '\130', '\040', '\166', '\141', '\040', '\061', + '\012', '\143', '\165', '\121', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\155', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\165', '\112', '\040', '\157', '\165', '\040', '\061', + '\012', '\171', '\127', '\170', '\040', '\156', '\171', '\040', '\061', + '\012', '\150', '\125', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\172', '\120', '\040', '\166', '\141', '\040', '\061', + '\012', '\162', '\123', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\147', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\172', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\152', '\102', '\040', '\163', '\172', '\040', '\061', + '\012', '\123', '\152', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\146', '\101', '\040', '\146', '\157', '\040', '\061', + '\012', '\146', '\110', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\153', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\144', '\106', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\127', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\142', '\101', '\040', '\151', '\152', '\040', '\061', + '\012', '\102', '\155', '\142', '\040', '\155', '\145', '\040', '\061', + '\012', '\171', '\152', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\162', '\170', '\132', '\040', '\145', '\162', '\040', '\061', + '\012', '\126', '\155', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\151', '\111', '\161', '\040', '\151', '\156', '\040', '\061', + '\012', '\127', '\147', '\154', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\122', '\160', '\040', '\155', '\145', '\040', '\061', + '\012', '\167', '\166', '\123', '\040', '\166', '\141', '\040', '\061', + '\012', '\125', '\166', '\171', '\040', '\166', '\141', '\040', '\061', + '\012', '\171', '\160', '\121', '\040', '\160', '\162', '\040', '\061', + '\012', '\166', '\106', '\167', '\040', '\166', '\157', '\040', '\061', + '\012', '\146', '\161', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\167', '\112', '\040', '\163', '\164', '\040', '\061', + '\012', '\112', '\162', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\170', '\105', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\132', '\153', '\040', '\154', '\145', '\040', '\061', + '\012', '\146', '\126', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\150', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\150', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\123', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\121', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\110', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\165', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\160', '\107', '\040', '\151', '\152', '\040', '\061', + '\012', '\120', '\153', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\121', '\142', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\106', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\107', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\163', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\167', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\171', '\121', '\040', '\156', '\171', '\040', '\061', + '\012', '\144', '\161', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\110', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\115', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\113', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\114', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\155', '\117', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\102', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\160', '\152', '\121', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\132', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\111', '\165', '\040', '\165', '\156', '\040', '\061', + '\012', '\171', '\143', '\131', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\104', '\146', '\040', '\155', '\145', '\040', '\061', + '\012', '\171', '\112', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\111', '\163', '\170', '\040', '\163', '\164', '\040', '\061', + '\012', '\121', '\161', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\106', '\153', '\167', '\040', '\153', '\141', '\040', '\061', + '\012', '\103', '\160', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\131', '\166', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\152', '\107', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\107', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\144', '\155', '\040', '\144', '\145', '\040', '\061', + '\012', '\150', '\102', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\170', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\131', '\167', '\142', '\040', '\157', '\167', '\040', '\061', + '\012', '\126', '\164', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\152', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\104', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\165', '\107', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\166', '\106', '\040', '\166', '\141', '\040', '\061', + '\012', '\165', '\161', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\167', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\102', '\147', '\142', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\156', '\125', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\160', '\111', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\113', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\130', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\153', '\114', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\147', '\131', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\170', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\110', '\150', '\171', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\160', '\112', '\040', '\160', '\162', '\040', '\061', + '\012', '\143', '\126', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\126', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\112', '\172', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\156', '\104', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\152', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\132', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\161', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\106', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\116', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\106', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\110', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\122', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\170', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\160', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\156', '\115', '\153', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\152', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\150', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\160', '\104', '\040', '\160', '\162', '\040', '\061', + '\012', '\104', '\146', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\171', '\117', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\150', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\126', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\156', '\113', '\143', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\153', '\112', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\167', '\123', '\040', '\143', '\150', '\040', '\061', + '\012', '\157', '\104', '\146', '\040', '\157', '\156', '\040', '\061', + '\012', '\155', '\153', '\131', '\040', '\153', '\141', '\040', '\061', + '\012', '\147', '\144', '\126', '\040', '\156', '\147', '\040', '\061', + '\012', '\130', '\150', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\125', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\141', '\112', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\121', '\170', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\172', '\123', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\125', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\124', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\157', '\126', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\144', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\110', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\170', '\113', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\142', '\106', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\127', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\161', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\155', '\110', '\040', '\144', '\145', '\040', '\061', + '\012', '\124', '\164', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\121', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\106', '\150', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\143', '\131', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\163', '\122', '\040', '\163', '\164', '\040', '\061', + '\012', '\151', '\127', '\147', '\040', '\151', '\156', '\040', '\061', + '\012', '\130', '\171', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\130', '\152', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\170', '\160', '\142', '\040', '\160', '\162', '\040', '\061', + '\012', '\154', '\172', '\131', '\040', '\154', '\145', '\040', '\061', + '\012', '\160', '\172', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\126', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\111', '\152', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\166', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\156', '\142', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\144', '\110', '\040', '\144', '\145', '\040', '\061', + '\012', '\143', '\104', '\144', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\161', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\146', '\125', '\040', '\156', '\171', '\040', '\061', + '\012', '\161', '\157', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\153', '\167', '\040', '\153', '\141', '\040', '\061', + '\012', '\113', '\143', '\153', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\125', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\127', '\155', '\040', '\163', '\172', '\040', '\061', + '\012', '\102', '\146', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\162', '\121', '\152', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\145', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\160', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\161', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\172', '\117', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\152', '\121', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\124', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\122', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\144', '\121', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\142', '\121', '\040', '\167', '\141', '\040', '\061', + '\012', '\121', '\160', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\111', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\170', '\116', '\040', '\156', '\171', '\040', '\061', + '\012', '\156', '\103', '\153', '\040', '\141', '\156', '\040', '\061', + '\012', '\112', '\161', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\105', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\144', '\105', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\103', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\121', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\113', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\124', '\152', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\132', '\143', '\171', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\155', '\122', '\040', '\153', '\141', '\040', '\061', + '\012', '\143', '\124', '\160', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\161', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\166', '\132', '\040', '\166', '\141', '\040', '\061', + '\012', '\143', '\114', '\167', '\040', '\143', '\150', '\040', '\061', + '\012', '\157', '\111', '\167', '\040', '\157', '\156', '\040', '\061', + '\012', '\170', '\152', '\107', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\164', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\143', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\147', '\124', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\161', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\165', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\163', '\131', '\040', '\163', '\164', '\040', '\061', + '\012', '\152', '\103', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\106', '\142', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\161', '\110', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\152', '\172', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\147', '\122', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\151', '\130', '\040', '\151', '\156', '\040', '\061', + '\012', '\161', '\156', '\117', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\155', '\116', '\040', '\155', '\145', '\040', '\061', + '\012', '\167', '\147', '\110', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\142', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\153', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\160', '\172', '\103', '\040', '\160', '\157', '\040', '\061', + '\012', '\154', '\146', '\130', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\102', '\165', '\040', '\165', '\156', '\040', '\061', + '\012', '\155', '\114', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\160', '\155', '\131', '\040', '\155', '\145', '\040', '\061', + '\012', '\170', '\161', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\152', '\131', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\162', '\110', '\040', '\145', '\162', '\040', '\061', + '\012', '\111', '\165', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\146', '\104', '\040', '\156', '\171', '\040', '\061', + '\012', '\143', '\154', '\107', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\144', '\132', '\040', '\143', '\150', '\040', '\061', + '\012', '\145', '\124', '\144', '\040', '\145', '\162', '\040', '\061', + '\012', '\154', '\130', '\166', '\040', '\154', '\145', '\040', '\061', + '\012', '\153', '\160', '\126', '\040', '\153', '\141', '\040', '\061', + '\012', '\163', '\132', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\170', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\155', '\112', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\153', '\105', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\125', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\103', '\161', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\103', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\170', '\121', '\040', '\160', '\162', '\040', '\061', + '\012', '\131', '\167', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\170', '\167', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\127', '\152', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\161', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\124', '\160', '\040', '\156', '\147', '\040', '\061', + '\012', '\165', '\132', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\144', '\110', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\165', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\126', '\155', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\152', '\131', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\150', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\146', '\104', '\040', '\167', '\141', '\040', '\061', + '\012', '\132', '\152', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\151', '\120', '\166', '\040', '\151', '\156', '\040', '\061', + '\012', '\155', '\172', '\127', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\130', '\155', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\105', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\117', '\172', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\105', '\160', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\104', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\132', '\154', '\167', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\142', '\122', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\103', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\157', '\131', '\040', '\157', '\156', '\040', '\061', + '\012', '\160', '\153', '\124', '\040', '\153', '\141', '\040', '\061', + '\012', '\153', '\142', '\111', '\040', '\153', '\141', '\040', '\061', + '\012', '\150', '\144', '\127', '\040', '\144', '\145', '\040', '\061', + '\012', '\110', '\163', '\170', '\040', '\163', '\164', '\040', '\061', + '\012', '\172', '\160', '\130', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\146', '\126', '\040', '\163', '\172', '\040', '\061', + '\012', '\104', '\150', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\115', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\150', '\172', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\114', '\167', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\172', '\155', '\116', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\146', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\152', '\121', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\153', '\113', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\102', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\142', '\144', '\105', '\040', '\144', '\145', '\040', '\061', + '\012', '\121', '\170', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\161', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\150', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\131', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\150', '\105', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\142', '\106', '\040', '\143', '\150', '\040', '\061', + '\012', '\112', '\156', '\142', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\170', '\116', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\131', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\150', '\112', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\122', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\156', '\123', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\114', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\143', '\102', '\144', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\161', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\123', '\144', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\145', '\132', '\040', '\145', '\162', '\040', '\061', + '\012', '\112', '\167', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\144', '\120', '\146', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\116', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\153', '\111', '\142', '\040', '\153', '\141', '\040', '\061', + '\012', '\143', '\142', '\114', '\040', '\143', '\150', '\040', '\061', + '\012', '\121', '\144', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\115', '\146', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\152', '\112', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\155', '\170', '\131', '\040', '\155', '\145', '\040', '\061', + '\012', '\154', '\106', '\144', '\040', '\154', '\145', '\040', '\061', + '\012', '\164', '\167', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\106', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\143', '\162', '\102', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\122', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\110', '\164', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\131', '\146', '\040', '\160', '\162', '\040', '\061', + '\012', '\162', '\126', '\143', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\122', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\126', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\160', '\101', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\154', '\131', '\040', '\154', '\145', '\040', '\061', + '\012', '\163', '\116', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\113', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\164', '\166', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\131', '\152', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\167', '\120', '\040', '\155', '\145', '\040', '\061', + '\012', '\112', '\171', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\164', '\102', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\123', '\142', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\115', '\154', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\152', '\112', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\131', '\172', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\120', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\161', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\106', '\166', '\040', '\163', '\164', '\040', '\061', + '\012', '\170', '\153', '\110', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\132', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\150', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\167', '\116', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\152', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\121', '\155', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\115', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\143', '\127', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\112', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\124', '\155', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\155', '\121', '\040', '\153', '\141', '\040', '\061', + '\012', '\127', '\154', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\131', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\145', '\112', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\124', '\153', '\142', '\040', '\153', '\141', '\040', '\061', + '\012', '\150', '\146', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\170', '\131', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\104', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\143', '\116', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\121', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\157', '\150', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\122', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\142', '\126', '\040', '\154', '\145', '\040', '\061', + '\012', '\154', '\113', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\170', '\102', '\040', '\167', '\141', '\040', '\061', + '\012', '\114', '\167', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\146', '\161', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\153', '\132', '\040', '\153', '\141', '\040', '\061', + '\012', '\151', '\167', '\117', '\040', '\151', '\156', '\040', '\061', + '\012', '\144', '\147', '\125', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\166', '\117', '\040', '\144', '\145', '\040', '\061', + '\012', '\160', '\104', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\166', '\113', '\040', '\153', '\141', '\040', '\061', + '\012', '\152', '\154', '\126', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\130', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\153', '\106', '\040', '\153', '\165', '\040', '\061', + '\012', '\151', '\171', '\124', '\040', '\151', '\156', '\040', '\061', + '\012', '\125', '\146', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\156', '\172', '\125', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\142', '\110', '\040', '\142', '\165', '\040', '\061', + '\012', '\154', '\123', '\142', '\040', '\154', '\145', '\040', '\061', + '\012', '\130', '\160', '\146', '\040', '\160', '\162', '\040', '\061', + '\012', '\125', '\166', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\171', '\171', '\106', '\040', '\156', '\171', '\040', '\061', + '\012', '\146', '\170', '\120', '\040', '\146', '\157', '\040', '\061', + '\012', '\152', '\131', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\152', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\170', '\114', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\167', '\111', '\040', '\160', '\162', '\040', '\061', + '\012', '\152', '\125', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\162', '\106', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\163', '\106', '\040', '\163', '\164', '\040', '\061', + '\012', '\143', '\144', '\127', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\167', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\170', '\144', '\110', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\131', '\163', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\106', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\111', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\111', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\124', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\146', '\105', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\122', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\150', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\115', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\160', '\102', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\170', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\120', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\156', '\142', '\102', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\153', '\121', '\040', '\163', '\164', '\040', '\061', + '\012', '\165', '\113', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\121', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\153', '\127', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\167', '\161', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\167', '\101', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\112', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\150', '\143', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\146', '\113', '\040', '\141', '\156', '\040', '\061', + '\012', '\165', '\130', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\147', '\101', '\040', '\143', '\150', '\040', '\061', + '\012', '\120', '\152', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\114', '\161', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\167', '\103', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\152', '\116', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\153', '\120', '\040', '\153', '\141', '\040', '\061', + '\012', '\122', '\161', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\107', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\120', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\142', '\124', '\040', '\153', '\141', '\040', '\061', + '\012', '\153', '\160', '\121', '\040', '\153', '\141', '\040', '\061', + '\012', '\115', '\172', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\152', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\153', '\104', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\167', '\122', '\040', '\151', '\152', '\040', '\061', + '\012', '\127', '\171', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\170', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\107', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\166', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\172', '\116', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\103', '\155', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\154', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\102', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\155', '\112', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\106', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\104', '\155', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\146', '\103', '\040', '\160', '\162', '\040', '\061', + '\012', '\114', '\160', '\171', '\040', '\160', '\162', '\040', '\061', + '\012', '\106', '\150', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\170', '\123', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\127', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\106', '\147', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\156', '\106', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\170', '\106', '\040', '\143', '\150', '\040', '\061', + '\012', '\141', '\126', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\123', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\152', '\172', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\156', '\103', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\161', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\162', '\132', '\040', '\145', '\162', '\040', '\061', + '\012', '\142', '\116', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\156', '\166', '\127', '\040', '\141', '\156', '\040', '\061', + '\012', '\121', '\171', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\106', '\150', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\107', '\166', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\114', '\160', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\114', '\142', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\113', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\112', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\152', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\156', '\121', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\156', '\160', '\130', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\151', '\117', '\040', '\151', '\156', '\040', '\061', + '\012', '\166', '\166', '\107', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\117', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\150', '\150', '\105', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\144', '\116', '\040', '\144', '\145', '\040', '\061', + '\012', '\103', '\172', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\152', '\125', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\126', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\113', '\143', '\147', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\166', '\110', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\164', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\111', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\152', '\121', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\106', '\171', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\160', '\125', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\170', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\142', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\166', '\112', '\040', '\163', '\164', '\040', '\061', + '\012', '\166', '\152', '\127', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\160', '\131', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\156', '\122', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\121', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\103', '\166', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\153', '\102', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\147', '\102', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\146', '\104', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\110', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\144', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\124', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\154', '\124', '\155', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\147', '\102', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\170', '\123', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\120', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\160', '\121', '\040', '\160', '\162', '\040', '\061', + '\012', '\171', '\170', '\127', '\040', '\156', '\171', '\040', '\061', + '\012', '\110', '\152', '\153', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\116', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\143', '\156', '\112', '\040', '\141', '\156', '\040', '\061', + '\012', '\165', '\110', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\166', '\110', '\040', '\151', '\152', '\040', '\061', + '\012', '\107', '\147', '\156', '\040', '\156', '\147', '\040', '\061', + '\012', '\154', '\142', '\123', '\040', '\154', '\145', '\040', '\061', + '\012', '\121', '\143', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\161', '\122', '\040', '\143', '\150', '\040', '\061', + '\012', '\112', '\171', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\122', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\156', '\146', '\101', '\040', '\141', '\156', '\040', '\061', + '\012', '\154', '\130', '\167', '\040', '\154', '\145', '\040', '\061', + '\012', '\143', '\155', '\112', '\040', '\143', '\150', '\040', '\061', + '\012', '\131', '\163', '\167', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\121', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\163', '\130', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\111', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\152', '\132', '\040', '\151', '\152', '\040', '\061', + '\012', '\114', '\154', '\142', '\040', '\154', '\145', '\040', '\061', + '\012', '\155', '\115', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\154', '\126', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\160', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\155', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\170', '\115', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\107', '\167', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\121', '\152', '\166', '\040', '\151', '\152', '\040', '\061', + '\012', '\154', '\161', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\112', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\153', '\171', '\040', '\153', '\141', '\040', '\061', + '\012', '\150', '\104', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\114', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\131', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\103', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\155', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\124', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\153', '\106', '\040', '\153', '\141', '\040', '\061', + '\012', '\150', '\106', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\156', '\102', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\171', '\112', '\040', '\156', '\171', '\040', '\061', + '\012', '\156', '\111', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\131', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\127', '\161', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\161', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\131', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\121', '\144', '\172', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\142', '\116', '\040', '\142', '\145', '\040', '\061', + '\012', '\161', '\167', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\125', '\142', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\167', '\164', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\121', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\112', '\153', '\040', '\151', '\152', '\040', '\061', + '\012', '\116', '\172', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\144', '\103', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\116', '\146', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\110', '\147', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\143', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\166', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\163', '\170', '\112', '\040', '\163', '\164', '\040', '\061', + '\012', '\167', '\115', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\106', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\107', '\172', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\146', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\144', '\121', '\040', '\144', '\145', '\040', '\061', + '\012', '\130', '\147', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\153', '\111', '\040', '\153', '\141', '\040', '\061', + '\012', '\160', '\166', '\113', '\040', '\166', '\141', '\040', '\061', + '\012', '\103', '\161', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\106', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\157', '\110', '\155', '\040', '\157', '\156', '\040', '\061', + '\012', '\141', '\112', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\106', '\172', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\127', '\153', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\155', '\105', '\040', '\155', '\145', '\040', '\061', + '\012', '\163', '\115', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\164', '\102', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\116', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\121', '\144', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\150', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\101', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\162', '\115', '\040', '\145', '\162', '\040', '\061', + '\012', '\162', '\110', '\167', '\040', '\145', '\162', '\040', '\061', + '\012', '\114', '\166', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\122', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\152', '\126', '\040', '\151', '\152', '\040', '\061', + '\012', '\150', '\122', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\153', '\126', '\040', '\153', '\141', '\040', '\061', + '\012', '\152', '\127', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\131', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\124', '\171', '\040', '\166', '\141', '\040', '\061', + '\012', '\144', '\170', '\126', '\040', '\144', '\145', '\040', '\061', + '\012', '\155', '\113', '\171', '\040', '\155', '\145', '\040', '\061', + '\012', '\121', '\154', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\125', '\160', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\121', '\160', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\167', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\171', '\130', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\124', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\156', '\124', '\040', '\141', '\156', '\040', '\061', + '\012', '\126', '\154', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\161', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\144', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\130', '\161', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\104', '\146', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\157', '\145', '\117', '\040', '\157', '\156', '\040', '\061', + '\012', '\156', '\103', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\154', '\130', '\144', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\110', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\101', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\131', '\142', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\172', '\104', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\107', '\153', '\040', '\144', '\145', '\040', '\061', + '\012', '\160', '\154', '\110', '\040', '\154', '\145', '\040', '\061', + '\012', '\154', '\170', '\107', '\040', '\154', '\145', '\040', '\061', + '\012', '\110', '\147', '\160', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\122', '\172', '\040', '\151', '\152', '\040', '\061', + '\012', '\144', '\124', '\163', '\040', '\144', '\145', '\040', '\061', + '\012', '\155', '\103', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\154', '\110', '\146', '\040', '\154', '\145', '\040', '\061', + '\012', '\154', '\114', '\152', '\040', '\154', '\145', '\040', '\061', + '\012', '\164', '\116', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\113', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\147', '\107', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\154', '\121', '\040', '\154', '\145', '\040', '\061', + '\012', '\131', '\171', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\104', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\130', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\172', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\105', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\154', '\150', '\123', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\172', '\115', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\161', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\143', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\142', '\106', '\040', '\142', '\145', '\040', '\061', + '\012', '\130', '\163', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\114', '\156', '\143', '\040', '\141', '\156', '\040', '\061', + '\012', '\107', '\161', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\152', '\117', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\150', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\147', '\110', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\127', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\113', '\146', '\040', '\156', '\171', '\040', '\061', + '\012', '\165', '\121', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\113', '\167', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\144', '\170', '\107', '\040', '\144', '\145', '\040', '\061', + '\012', '\131', '\161', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\113', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\127', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\143', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\146', '\131', '\040', '\167', '\141', '\040', '\061', + '\012', '\162', '\102', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\112', '\144', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\131', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\123', '\161', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\121', '\166', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\160', '\106', '\040', '\160', '\162', '\040', '\061', + '\012', '\146', '\143', '\130', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\146', '\113', '\040', '\156', '\171', '\040', '\061', + '\012', '\152', '\121', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\147', '\124', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\121', '\167', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\120', '\156', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\132', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\120', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\165', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\170', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\151', '\130', '\162', '\040', '\151', '\156', '\040', '\061', + '\012', '\160', '\143', '\105', '\040', '\143', '\150', '\040', '\061', + '\012', '\116', '\161', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\152', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\172', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\155', '\106', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\166', '\127', '\040', '\166', '\141', '\040', '\061', + '\012', '\145', '\112', '\167', '\040', '\145', '\162', '\040', '\061', + '\012', '\111', '\161', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\130', '\171', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\146', '\127', '\040', '\167', '\141', '\040', '\061', + '\012', '\126', '\144', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\112', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\120', '\144', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\102', '\152', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\114', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\144', '\127', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\121', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\172', '\127', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\167', '\121', '\040', '\166', '\141', '\040', '\061', + '\012', '\162', '\167', '\125', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\120', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\106', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\166', '\110', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\127', '\154', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\147', '\117', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\114', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\153', '\142', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\102', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\104', '\150', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\147', '\166', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\160', '\101', '\040', '\160', '\162', '\040', '\061', + '\012', '\172', '\170', '\103', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\146', '\123', '\040', '\156', '\147', '\040', '\061', + '\012', '\115', '\166', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\165', '\120', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\161', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\161', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\115', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\167', '\161', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\162', '\112', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\144', '\116', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\167', '\122', '\040', '\160', '\162', '\040', '\061', + '\012', '\150', '\115', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\120', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\126', '\142', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\172', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\116', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\112', '\142', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\124', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\132', '\146', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\106', '\172', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\113', '\143', '\167', '\040', '\143', '\150', '\040', '\061', + '\012', '\145', '\113', '\146', '\040', '\145', '\162', '\040', '\061', + '\012', '\160', '\161', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\160', '\142', '\040', '\160', '\162', '\040', '\061', + '\012', '\152', '\153', '\106', '\040', '\151', '\152', '\040', '\061', + '\012', '\126', '\170', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\150', '\107', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\102', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\143', '\124', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\115', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\132', '\166', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\153', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\111', '\146', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\144', '\122', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\132', '\154', '\152', '\040', '\154', '\145', '\040', '\061', + '\012', '\113', '\167', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\116', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\144', '\131', '\171', '\040', '\144', '\145', '\040', '\061', + '\012', '\150', '\132', '\154', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\164', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\120', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\131', '\153', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\112', '\154', '\167', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\116', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\162', '\127', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\127', '\144', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\130', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\121', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\146', '\106', '\040', '\151', '\152', '\040', '\061', + '\012', '\105', '\152', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\107', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\132', '\152', '\172', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\144', '\115', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\154', '\106', '\040', '\154', '\145', '\040', '\061', + '\012', '\143', '\170', '\132', '\040', '\143', '\150', '\040', '\061', + '\012', '\132', '\147', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\143', '\112', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\154', '\105', '\040', '\154', '\145', '\040', '\061', + '\012', '\156', '\131', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\127', '\146', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\112', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\142', '\166', '\106', '\040', '\166', '\141', '\040', '\061', + '\012', '\110', '\156', '\172', '\040', '\141', '\156', '\040', '\061', + '\012', '\127', '\153', '\166', '\040', '\153', '\141', '\040', '\061', + '\012', '\115', '\166', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\104', '\170', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\102', '\166', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\115', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\122', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\166', '\114', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\107', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\106', '\160', '\040', '\155', '\145', '\040', '\061', + '\012', '\147', '\116', '\142', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\103', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\106', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\113', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\112', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\172', '\111', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\147', '\107', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\113', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\161', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\170', '\121', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\166', '\107', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\147', '\106', '\040', '\156', '\147', '\040', '\061', + '\012', '\130', '\170', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\114', '\167', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\154', '\130', '\040', '\154', '\145', '\040', '\061', + '\012', '\154', '\120', '\172', '\040', '\154', '\145', '\040', '\061', + '\012', '\127', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\172', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\165', '\110', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\106', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\166', '\126', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\130', '\145', '\040', '\154', '\145', '\040', '\061', + '\012', '\132', '\146', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\111', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\142', '\102', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\132', '\146', '\040', '\156', '\171', '\040', '\061', + '\012', '\163', '\113', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\160', '\114', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\113', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\111', '\142', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\151', '\121', '\142', '\040', '\151', '\156', '\040', '\061', + '\012', '\106', '\170', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\106', '\160', '\142', '\040', '\160', '\162', '\040', '\061', + '\012', '\127', '\166', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\172', '\104', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\153', '\124', '\040', '\153', '\141', '\040', '\061', + '\012', '\131', '\153', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\152', '\107', '\040', '\141', '\156', '\040', '\061', + '\012', '\125', '\166', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\146', '\124', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\143', '\111', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\104', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\144', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\115', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\112', '\142', '\171', '\040', '\142', '\145', '\040', '\061', + '\012', '\154', '\167', '\112', '\040', '\154', '\145', '\040', '\061', + '\012', '\163', '\127', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\123', '\166', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\156', '\162', '\130', '\040', '\141', '\156', '\040', '\061', + '\012', '\165', '\166', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\126', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\164', '\161', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\126', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\153', '\121', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\146', '\142', '\107', '\040', '\142', '\145', '\040', '\061', + '\012', '\162', '\161', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\110', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\150', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\131', '\172', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\106', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\121', '\160', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\165', '\101', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\170', '\120', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\103', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\141', '\115', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\154', '\131', '\040', '\154', '\145', '\040', '\061', + '\012', '\143', '\124', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\102', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\143', '\121', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\122', '\142', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\126', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\107', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\144', '\116', '\040', '\144', '\145', '\040', '\061', + '\012', '\147', '\146', '\116', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\120', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\143', '\111', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\170', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\162', '\110', '\142', '\040', '\145', '\162', '\040', '\061', + '\012', '\160', '\126', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\162', '\126', '\152', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\147', '\123', '\040', '\156', '\147', '\040', '\061', + '\012', '\106', '\161', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\115', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\121', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\132', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\102', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\167', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\110', '\146', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\172', '\130', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\143', '\124', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\106', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\143', '\102', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\146', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\161', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\146', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\152', '\125', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\150', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\127', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\161', '\105', '\040', '\151', '\156', '\040', '\061', + '\012', '\147', '\160', '\125', '\040', '\156', '\147', '\040', '\061', + '\012', '\151', '\127', '\142', '\040', '\151', '\156', '\040', '\061', + '\012', '\164', '\154', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\131', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\103', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\157', '\113', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\123', '\147', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\166', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\146', '\131', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\142', '\115', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\166', '\101', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\110', '\160', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\166', '\113', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\160', '\132', '\040', '\160', '\162', '\040', '\061', + '\012', '\144', '\146', '\130', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\162', '\113', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\145', '\105', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\153', '\131', '\040', '\153', '\141', '\040', '\061', + '\012', '\163', '\142', '\130', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\143', '\123', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\113', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\154', '\170', '\040', '\154', '\145', '\040', '\061', + '\012', '\132', '\161', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\127', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\144', '\114', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\166', '\107', '\040', '\151', '\152', '\040', '\061', + '\012', '\115', '\147', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\167', '\106', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\144', '\120', '\040', '\144', '\145', '\040', '\061', + '\012', '\165', '\115', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\143', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\162', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\115', '\164', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\121', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\110', '\160', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\172', '\160', '\111', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\153', '\122', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\150', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\123', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\106', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\165', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\171', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\107', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\131', '\172', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\142', '\103', '\040', '\167', '\141', '\040', '\061', + '\012', '\167', '\123', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\163', '\132', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\122', '\172', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\106', '\154', '\170', '\040', '\154', '\145', '\040', '\061', + '\012', '\142', '\161', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\143', '\110', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\155', '\107', '\040', '\155', '\145', '\040', '\061', + '\012', '\172', '\103', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\141', '\104', '\040', '\141', '\156', '\040', '\061', + '\012', '\151', '\167', '\110', '\040', '\151', '\156', '\040', '\061', + '\012', '\161', '\104', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\107', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\130', '\150', '\171', '\040', '\164', '\150', '\040', '\061', + '\012', '\145', '\126', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\153', '\112', '\040', '\167', '\141', '\040', '\061', + '\012', '\114', '\143', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\147', '\121', '\040', '\156', '\147', '\040', '\061', + '\012', '\104', '\150', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\146', '\117', '\040', '\163', '\172', '\040', '\061', + '\012', '\153', '\126', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\155', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\117', '\167', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\167', '\132', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\156', '\116', '\040', '\141', '\156', '\040', '\061', + '\012', '\115', '\172', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\155', '\131', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\171', '\114', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\170', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\167', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\124', '\170', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\113', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\142', '\152', '\130', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\142', '\123', '\040', '\160', '\162', '\040', '\061', + '\012', '\172', '\162', '\120', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\112', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\147', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\167', '\131', '\040', '\163', '\172', '\040', '\061', + '\012', '\162', '\130', '\153', '\040', '\145', '\162', '\040', '\061', + '\012', '\156', '\104', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\107', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\155', '\121', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\160', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\114', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\126', '\146', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\167', '\103', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\143', '\147', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\132', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\152', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\121', '\141', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\162', '\107', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\112', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\112', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\143', '\115', '\144', '\040', '\143', '\150', '\040', '\061', + '\012', '\121', '\143', '\163', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\153', '\113', '\040', '\153', '\141', '\040', '\061', + '\012', '\152', '\116', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\162', '\131', '\040', '\145', '\162', '\040', '\061', + '\012', '\130', '\167', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\162', '\132', '\154', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\170', '\125', '\040', '\156', '\147', '\040', '\061', + '\012', '\114', '\156', '\166', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\147', '\103', '\040', '\156', '\147', '\040', '\061', + '\012', '\104', '\161', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\114', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\156', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\152', '\125', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\166', '\117', '\040', '\166', '\141', '\040', '\061', + '\012', '\157', '\126', '\155', '\040', '\157', '\156', '\040', '\061', + '\012', '\166', '\127', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\107', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\142', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\123', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\112', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\112', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\157', '\121', '\166', '\040', '\157', '\156', '\040', '\061', + '\012', '\126', '\167', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\156', '\125', '\040', '\141', '\156', '\040', '\061', + '\012', '\116', '\155', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\124', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\105', '\144', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\165', '\161', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\162', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\156', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\112', '\146', '\040', '\155', '\145', '\040', '\061', + '\012', '\153', '\104', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\150', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\114', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\153', '\125', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\161', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\131', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\106', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\142', '\121', '\040', '\142', '\145', '\040', '\061', + '\012', '\166', '\143', '\123', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\161', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\153', '\106', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\106', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\160', '\105', '\040', '\153', '\141', '\040', '\061', + '\012', '\107', '\170', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\132', '\164', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\111', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\153', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\144', '\126', '\040', '\144', '\145', '\040', '\061', + '\012', '\162', '\167', '\120', '\040', '\145', '\162', '\040', '\061', + '\012', '\141', '\103', '\147', '\040', '\141', '\156', '\040', '\061', + '\012', '\132', '\162', '\163', '\040', '\145', '\162', '\040', '\061', + '\012', '\172', '\155', '\127', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\146', '\117', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\102', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\142', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\104', '\170', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\144', '\104', '\040', '\144', '\145', '\040', '\061', + '\012', '\156', '\102', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\154', '\162', '\126', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\121', '\161', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\154', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\164', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\161', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\122', '\155', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\126', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\103', '\162', '\161', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\106', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\130', '\152', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\103', '\155', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\127', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\172', '\117', '\040', '\151', '\152', '\040', '\061', + '\012', '\115', '\144', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\164', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\107', '\166', '\040', '\145', '\162', '\040', '\061', + '\012', '\153', '\107', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\114', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\165', '\127', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\143', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\126', '\160', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\127', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\130', '\172', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\127', '\153', '\142', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\172', '\110', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\165', '\120', '\040', '\165', '\156', '\040', '\061', + '\012', '\144', '\110', '\166', '\040', '\144', '\145', '\040', '\061', + '\012', '\104', '\155', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\104', '\147', '\166', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\147', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\164', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\115', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\110', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\132', '\146', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\132', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\152', '\153', '\110', '\040', '\151', '\152', '\040', '\061', + '\012', '\162', '\116', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\115', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\160', '\106', '\040', '\160', '\162', '\040', '\061', + '\012', '\144', '\152', '\104', '\040', '\144', '\145', '\040', '\061', + '\012', '\142', '\170', '\126', '\040', '\142', '\145', '\040', '\061', + '\012', '\150', '\147', '\123', '\040', '\164', '\150', '\040', '\061', + '\012', '\120', '\153', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\104', '\170', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\115', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\144', '\107', '\152', '\040', '\144', '\145', '\040', '\061', + '\012', '\153', '\142', '\110', '\040', '\153', '\141', '\040', '\061', + '\012', '\114', '\150', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\104', '\166', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\162', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\111', '\152', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\165', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\167', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\150', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\143', '\122', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\150', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\147', '\120', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\153', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\161', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\170', '\131', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\126', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\154', '\113', '\144', '\040', '\154', '\145', '\040', '\061', + '\012', '\116', '\154', '\171', '\040', '\154', '\145', '\040', '\061', + '\012', '\171', '\113', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\102', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\121', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\153', '\131', '\167', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\121', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\166', '\127', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\107', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\171', '\164', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\166', '\125', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\152', '\172', '\040', '\153', '\141', '\040', '\061', + '\012', '\152', '\126', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\121', '\142', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\161', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\167', '\165', '\040', '\153', '\165', '\040', '\061', + '\012', '\121', '\167', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\144', '\143', '\132', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\150', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\155', '\123', '\040', '\156', '\147', '\040', '\061', + '\012', '\111', '\161', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\132', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\114', '\156', '\040', '\164', '\150', '\040', '\061', + '\012', '\145', '\115', '\146', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\116', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\120', '\155', '\040', '\165', '\155', '\040', '\061', + '\012', '\160', '\115', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\172', '\127', '\040', '\163', '\172', '\040', '\061', + '\012', '\153', '\122', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\172', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\142', '\117', '\040', '\142', '\145', '\040', '\061', + '\012', '\130', '\170', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\156', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\102', '\166', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\152', '\132', '\040', '\151', '\152', '\040', '\061', + '\012', '\164', '\143', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\155', '\102', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\106', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\170', '\102', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\102', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\126', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\142', '\157', '\121', '\040', '\157', '\156', '\040', '\061', + '\012', '\170', '\157', '\110', '\040', '\157', '\156', '\040', '\061', + '\012', '\144', '\127', '\147', '\040', '\144', '\145', '\040', '\061', + '\012', '\124', '\144', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\116', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\131', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\104', '\146', '\040', '\160', '\162', '\040', '\061', + '\012', '\154', '\167', '\107', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\104', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\144', '\171', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\156', '\132', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\172', '\125', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\113', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\162', '\166', '\103', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\165', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\156', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\103', '\171', '\040', '\166', '\141', '\040', '\061', + '\012', '\125', '\144', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\142', '\124', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\142', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\142', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\104', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\127', '\150', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\142', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\146', '\117', '\040', '\164', '\150', '\040', '\061', + '\012', '\124', '\146', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\142', '\127', '\040', '\144', '\145', '\040', '\061', + '\012', '\102', '\144', '\171', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\152', '\122', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\142', '\103', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\165', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\103', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\127', '\144', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\122', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\142', '\127', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\166', '\132', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\144', '\112', '\152', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\132', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\147', '\161', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\142', '\110', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\112', '\154', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\150', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\126', '\160', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\126', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\103', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\157', '\131', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\167', '\110', '\040', '\153', '\141', '\040', '\061', + '\012', '\166', '\167', '\116', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\146', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\154', '\117', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\164', '\130', '\040', '\164', '\151', '\040', '\061', + '\012', '\144', '\113', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\121', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\104', '\154', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\126', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\160', '\116', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\153', '\107', '\040', '\153', '\141', '\040', '\061', + '\012', '\145', '\161', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\144', '\104', '\040', '\144', '\151', '\040', '\061', + '\012', '\146', '\121', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\131', '\150', '\154', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\102', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\105', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\150', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\147', '\166', '\040', '\156', '\147', '\040', '\061', + '\012', '\114', '\163', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\146', '\112', '\040', '\144', '\145', '\040', '\061', + '\012', '\132', '\144', '\160', '\040', '\144', '\145', '\040', '\061', + '\012', '\162', '\132', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\132', '\150', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\164', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\170', '\121', '\040', '\163', '\172', '\040', '\061', + '\012', '\126', '\156', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\110', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\131', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\102', '\161', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\162', '\126', '\040', '\145', '\162', '\040', '\061', + '\012', '\131', '\143', '\163', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\122', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\151', '\127', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\126', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\132', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\103', '\161', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\146', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\162', '\102', '\166', '\040', '\145', '\162', '\040', '\061', + '\012', '\117', '\152', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\107', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\132', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\106', '\166', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\132', '\147', '\163', '\040', '\156', '\147', '\040', '\061', + '\012', '\122', '\146', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\122', '\167', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\131', '\162', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\151', '\106', '\160', '\040', '\151', '\156', '\040', '\061', + '\012', '\142', '\126', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\172', '\146', '\115', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\144', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\107', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\164', '\156', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\144', '\122', '\040', '\144', '\145', '\040', '\061', + '\012', '\147', '\102', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\172', '\103', '\040', '\156', '\147', '\040', '\061', + '\012', '\120', '\167', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\101', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\156', '\130', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\147', '\124', '\040', '\156', '\147', '\040', '\061', + '\012', '\157', '\101', '\167', '\040', '\153', '\157', '\040', '\061', + '\012', '\170', '\102', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\144', '\116', '\146', '\040', '\144', '\145', '\040', '\061', + '\012', '\120', '\161', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\116', '\160', '\144', '\040', '\144', '\151', '\040', '\061', + '\012', '\157', '\125', '\171', '\040', '\153', '\157', '\040', '\061', + '\012', '\146', '\160', '\104', '\040', '\160', '\162', '\040', '\061', + '\012', '\122', '\146', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\154', '\130', '\155', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\127', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\127', '\166', '\040', '\166', '\151', '\040', '\061', + '\012', '\106', '\167', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\114', '\161', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\166', '\121', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\147', '\102', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\112', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\127', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\130', '\166', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\104', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\144', '\120', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\126', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\120', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\144', '\167', '\101', '\040', '\144', '\145', '\040', '\061', + '\012', '\117', '\161', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\151', '\132', '\040', '\151', '\156', '\040', '\061', + '\012', '\170', '\144', '\126', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\106', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\172', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\167', '\114', '\040', '\167', '\141', '\040', '\061', + '\012', '\163', '\127', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\124', '\160', '\171', '\040', '\160', '\162', '\040', '\061', + '\012', '\167', '\142', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\165', '\120', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\113', '\156', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\151', '\165', '\117', '\040', '\151', '\156', '\040', '\061', + '\012', '\121', '\144', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\131', '\146', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\165', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\114', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\112', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\116', '\146', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\131', '\161', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\163', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\172', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\111', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\163', '\121', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\147', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\123', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\170', '\121', '\040', '\146', '\157', '\040', '\061', + '\012', '\150', '\143', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\142', '\112', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\122', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\143', '\171', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\132', '\155', '\040', '\166', '\141', '\040', '\061', + '\012', '\130', '\172', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\147', '\122', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\154', '\117', '\040', '\154', '\145', '\040', '\061', + '\012', '\164', '\103', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\155', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\132', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\142', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\104', '\147', '\161', '\040', '\156', '\147', '\040', '\061', + '\012', '\126', '\153', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\161', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\115', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\125', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\147', '\103', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\142', '\104', '\040', '\163', '\172', '\040', '\061', + '\012', '\123', '\161', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\115', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\102', '\172', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\111', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\126', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\112', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\152', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\110', '\155', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\141', '\121', '\144', '\040', '\141', '\156', '\040', '\061', + '\012', '\151', '\110', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\115', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\167', '\127', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\165', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\103', '\146', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\156', '\120', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\114', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\122', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\115', '\166', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\155', '\122', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\146', '\112', '\040', '\156', '\171', '\040', '\061', + '\012', '\170', '\103', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\163', '\121', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\165', '\103', '\040', '\165', '\156', '\040', '\061', + '\012', '\103', '\164', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\120', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\152', '\111', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\155', '\103', '\040', '\155', '\145', '\040', '\061', + '\012', '\170', '\144', '\112', '\040', '\144', '\145', '\040', '\061', + '\012', '\156', '\130', '\166', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\163', '\117', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\122', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\142', '\106', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\116', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\153', '\110', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\167', '\115', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\170', '\104', '\040', '\156', '\147', '\040', '\061', + '\012', '\121', '\150', '\151', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\161', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\156', '\114', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\113', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\151', '\161', '\116', '\040', '\151', '\156', '\040', '\061', + '\012', '\144', '\153', '\130', '\040', '\144', '\145', '\040', '\061', + '\012', '\142', '\121', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\142', '\116', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\124', '\154', '\153', '\040', '\154', '\145', '\040', '\061', + '\012', '\116', '\154', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\103', '\170', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\115', '\161', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\120', '\166', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\167', '\132', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\107', '\142', '\040', '\160', '\162', '\040', '\061', + '\012', '\156', '\162', '\106', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\153', '\123', '\040', '\153', '\141', '\040', '\061', + '\012', '\144', '\122', '\166', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\112', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\151', '\161', '\106', '\040', '\151', '\156', '\040', '\061', + '\012', '\146', '\107', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\156', '\170', '\127', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\163', '\127', '\040', '\163', '\172', '\040', '\061', + '\012', '\155', '\146', '\121', '\040', '\155', '\145', '\040', '\061', + '\012', '\146', '\147', '\120', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\154', '\110', '\040', '\154', '\145', '\040', '\061', + '\012', '\156', '\162', '\111', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\130', '\166', '\040', '\153', '\141', '\040', '\061', + '\012', '\126', '\160', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\115', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\110', '\146', '\040', '\160', '\162', '\040', '\061', + '\012', '\152', '\144', '\115', '\040', '\144', '\145', '\040', '\061', + '\012', '\142', '\161', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\103', '\153', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\113', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\172', '\107', '\040', '\163', '\172', '\040', '\061', + '\012', '\165', '\111', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\116', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\152', '\131', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\167', '\114', '\040', '\167', '\141', '\040', '\061', + '\012', '\144', '\132', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\147', '\106', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\130', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\166', '\132', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\103', '\164', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\161', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\117', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\147', '\130', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\127', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\147', '\162', '\106', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\156', '\130', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\125', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\160', '\155', '\103', '\040', '\155', '\145', '\040', '\061', + '\012', '\165', '\172', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\111', '\166', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\166', '\111', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\156', '\132', '\040', '\141', '\156', '\040', '\061', + '\012', '\154', '\170', '\132', '\040', '\154', '\145', '\040', '\061', + '\012', '\130', '\167', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\104', '\161', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\113', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\126', '\167', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\123', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\110', '\167', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\171', '\116', '\170', '\040', '\156', '\171', '\040', '\061', + '\012', '\171', '\157', '\121', '\040', '\157', '\156', '\040', '\061', + '\012', '\143', '\123', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\105', '\166', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\111', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\146', '\132', '\040', '\144', '\145', '\040', '\061', + '\012', '\150', '\172', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\102', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\153', '\161', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\102', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\154', '\112', '\152', '\040', '\154', '\145', '\040', '\061', + '\012', '\143', '\152', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\162', '\127', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\141', '\104', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\104', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\114', '\170', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\121', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\112', '\164', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\122', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\146', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\142', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\132', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\163', '\162', '\121', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\112', '\161', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\106', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\116', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\122', '\153', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\160', '\172', '\112', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\142', '\101', '\040', '\154', '\145', '\040', '\061', + '\012', '\143', '\102', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\113', '\171', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\143', '\117', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\130', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\126', '\163', '\040', '\143', '\150', '\040', '\061', + '\012', '\162', '\131', '\155', '\040', '\145', '\162', '\040', '\061', + '\012', '\153', '\126', '\155', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\143', '\132', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\172', '\103', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\113', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\120', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\143', '\114', '\040', '\143', '\150', '\040', '\061', + '\012', '\131', '\152', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\172', '\170', '\125', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\142', '\124', '\040', '\142', '\145', '\040', '\061', + '\012', '\156', '\166', '\130', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\155', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\170', '\114', '\040', '\142', '\145', '\040', '\061', + '\012', '\130', '\167', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\152', '\123', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\154', '\116', '\146', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\124', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\153', '\106', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\114', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\162', '\130', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\130', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\166', '\105', '\040', '\163', '\172', '\040', '\061', + '\012', '\110', '\167', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\106', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\147', '\122', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\104', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\117', '\161', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\126', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\164', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\167', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\146', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\120', '\143', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\160', '\117', '\040', '\160', '\162', '\040', '\061', + '\012', '\103', '\167', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\170', '\117', '\040', '\167', '\141', '\040', '\061', + '\012', '\142', '\126', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\106', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\156', '\106', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\170', '\110', '\040', '\153', '\141', '\040', '\061', + '\012', '\131', '\167', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\144', '\104', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\127', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\124', '\154', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\155', '\127', '\040', '\153', '\141', '\040', '\061', + '\012', '\155', '\150', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\172', '\124', '\040', '\163', '\172', '\040', '\061', + '\012', '\162', '\166', '\112', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\143', '\112', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\153', '\123', '\040', '\153', '\141', '\040', '\061', + '\012', '\163', '\130', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\163', '\103', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\116', '\164', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\157', '\110', '\150', '\040', '\154', '\157', '\040', '\061', + '\012', '\131', '\166', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\126', '\146', '\040', '\160', '\162', '\040', '\061', + '\012', '\153', '\105', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\146', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\127', '\155', '\040', '\157', '\156', '\040', '\061', + '\012', '\164', '\115', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\131', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\156', '\106', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\121', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\121', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\113', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\113', '\146', '\040', '\155', '\145', '\040', '\061', + '\012', '\165', '\114', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\111', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\167', '\162', '\110', '\040', '\145', '\162', '\040', '\061', + '\012', '\160', '\147', '\114', '\040', '\156', '\147', '\040', '\061', + '\012', '\114', '\142', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\152', '\106', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\106', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\144', '\130', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\124', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\112', '\167', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\154', '\170', '\125', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\152', '\101', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\120', '\147', '\040', '\151', '\156', '\040', '\061', + '\012', '\130', '\156', '\163', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\153', '\127', '\040', '\153', '\141', '\040', '\061', + '\012', '\160', '\146', '\120', '\040', '\160', '\162', '\040', '\061', + '\012', '\104', '\171', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\127', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\172', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\152', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\167', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\116', '\167', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\142', '\102', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\167', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\164', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\154', '\130', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\132', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\131', '\155', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\167', '\146', '\130', '\040', '\167', '\141', '\040', '\061', + '\012', '\126', '\161', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\161', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\125', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\152', '\172', '\124', '\040', '\152', '\157', '\040', '\061', + '\012', '\153', '\116', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\155', '\121', '\040', '\155', '\145', '\040', '\061', + '\012', '\144', '\130', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\171', '\154', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\127', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\113', '\166', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\142', '\150', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\112', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\142', '\124', '\040', '\160', '\162', '\040', '\061', + '\012', '\141', '\102', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\122', '\150', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\101', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\102', '\147', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\161', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\144', '\103', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\102', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\143', '\130', '\153', '\040', '\143', '\150', '\040', '\061', + '\012', '\156', '\155', '\115', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\122', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\110', '\153', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\150', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\171', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\153', '\107', '\155', '\040', '\153', '\141', '\040', '\061', + '\012', '\163', '\107', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\113', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\104', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\114', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\112', '\163', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\116', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\127', '\147', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\155', '\114', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\126', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\106', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\142', '\104', '\040', '\163', '\172', '\040', '\061', + '\012', '\153', '\124', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\167', '\130', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\122', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\101', '\172', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\121', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\121', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\157', '\132', '\040', '\157', '\156', '\040', '\061', + '\012', '\152', '\120', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\171', '\107', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\130', '\152', '\040', '\153', '\141', '\040', '\061', + '\012', '\171', '\102', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\156', '\167', '\120', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\156', '\101', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\113', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\161', '\142', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\107', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\152', '\107', '\040', '\151', '\152', '\040', '\061', + '\012', '\113', '\161', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\126', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\123', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\127', '\155', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\104', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\110', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\131', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\172', '\162', '\127', '\040', '\145', '\162', '\040', '\061', + '\012', '\154', '\104', '\170', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\121', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\102', '\144', '\160', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\161', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\121', '\155', '\040', '\157', '\156', '\040', '\061', + '\012', '\121', '\163', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\115', '\146', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\142', '\121', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\165', '\122', '\040', '\165', '\156', '\040', '\061', + '\012', '\143', '\115', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\161', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\130', '\146', '\040', '\144', '\145', '\040', '\061', + '\012', '\162', '\110', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\150', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\116', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\110', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\124', '\160', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\152', '\131', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\112', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\103', '\153', '\040', '\154', '\145', '\040', '\061', + '\012', '\120', '\146', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\117', '\161', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\155', '\122', '\040', '\155', '\145', '\040', '\061', + '\012', '\121', '\160', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\116', '\143', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\131', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\146', '\101', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\162', '\123', '\040', '\145', '\162', '\040', '\061', + '\012', '\107', '\160', '\146', '\040', '\160', '\162', '\040', '\061', + '\012', '\152', '\155', '\104', '\040', '\151', '\152', '\040', '\061', + '\012', '\150', '\167', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\122', '\142', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\150', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\130', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\131', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\126', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\103', '\172', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\115', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\160', '\113', '\040', '\160', '\162', '\040', '\061', + '\012', '\150', '\126', '\171', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\143', '\112', '\040', '\143', '\150', '\040', '\061', + '\012', '\117', '\153', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\112', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\114', '\160', '\040', '\151', '\152', '\040', '\061', + '\012', '\156', '\131', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\156', '\160', '\106', '\040', '\157', '\156', '\040', '\061', + '\012', '\162', '\127', '\153', '\040', '\145', '\162', '\040', '\061', + '\012', '\155', '\143', '\120', '\040', '\143', '\150', '\040', '\061', + '\012', '\156', '\132', '\155', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\131', '\142', '\040', '\146', '\157', '\040', '\061', + '\012', '\172', '\142', '\103', '\040', '\163', '\172', '\040', '\061', + '\012', '\156', '\102', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\152', '\171', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\111', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\164', '\167', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\107', '\147', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\103', '\172', '\155', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\164', '\117', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\122', '\154', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\171', '\103', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\105', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\155', '\110', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\164', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\111', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\152', '\111', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\142', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\167', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\161', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\146', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\146', '\127', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\127', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\127', '\160', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\115', '\147', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\123', '\146', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\131', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\143', '\143', '\111', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\154', '\124', '\040', '\154', '\145', '\040', '\061', + '\012', '\107', '\161', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\103', '\155', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\110', '\146', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\102', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\103', '\146', '\040', '\156', '\171', '\040', '\061', + '\012', '\161', '\172', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\144', '\106', '\040', '\144', '\145', '\040', '\061', + '\012', '\126', '\144', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\112', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\146', '\122', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\154', '\126', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\117', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\156', '\146', '\106', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\124', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\107', '\153', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\101', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\166', '\146', '\106', '\040', '\166', '\141', '\040', '\061', + '\012', '\104', '\172', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\106', '\160', '\040', '\153', '\141', '\040', '\061', + '\012', '\152', '\124', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\156', '\116', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\143', '\116', '\040', '\143', '\150', '\040', '\061', + '\012', '\112', '\152', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\164', '\113', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\162', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\155', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\115', '\161', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\146', '\122', '\040', '\146', '\157', '\040', '\061', + '\012', '\167', '\121', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\161', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\125', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\157', '\151', '\125', '\040', '\151', '\156', '\040', '\061', + '\012', '\161', '\163', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\107', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\164', '\117', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\120', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\122', '\161', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\153', '\130', '\040', '\153', '\141', '\040', '\061', + '\012', '\127', '\163', '\142', '\040', '\163', '\164', '\040', '\061', + '\012', '\143', '\170', '\122', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\132', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\171', '\121', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\151', '\125', '\040', '\151', '\156', '\040', '\061', + '\012', '\170', '\166', '\127', '\040', '\166', '\141', '\040', '\061', + '\012', '\141', '\104', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\121', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\170', '\103', '\040', '\151', '\152', '\040', '\061', + '\012', '\124', '\167', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\163', '\121', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\102', '\146', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\141', '\107', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\120', '\147', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\110', '\172', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\147', '\127', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\144', '\106', '\040', '\144', '\145', '\040', '\061', + '\012', '\153', '\142', '\131', '\040', '\153', '\141', '\040', '\061', + '\012', '\121', '\152', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\110', '\170', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\164', '\126', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\170', '\132', '\040', '\141', '\156', '\040', '\061', + '\012', '\157', '\126', '\144', '\040', '\157', '\156', '\040', '\061', + '\012', '\110', '\154', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\113', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\101', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\144', '\116', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\160', '\161', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\145', '\111', '\166', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\155', '\127', '\040', '\155', '\145', '\040', '\061', + '\012', '\171', '\143', '\113', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\121', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\150', '\155', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\154', '\106', '\040', '\141', '\156', '\040', '\061', + '\012', '\107', '\153', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\102', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\150', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\156', '\153', '\040', '\141', '\156', '\040', '\061', + '\012', '\126', '\146', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\156', '\102', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\166', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\141', '\161', '\116', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\114', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\112', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\164', '\121', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\127', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\167', '\127', '\040', '\167', '\141', '\040', '\061', + '\012', '\166', '\172', '\102', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\171', '\122', '\040', '\156', '\171', '\040', '\061', + '\012', '\161', '\161', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\171', '\111', '\040', '\156', '\171', '\040', '\061', + '\012', '\152', '\172', '\112', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\147', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\147', '\121', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\114', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\161', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\156', '\162', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\110', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\141', '\121', '\147', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\106', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\152', '\121', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\160', '\104', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\172', '\116', '\040', '\163', '\172', '\040', '\061', + '\012', '\151', '\111', '\167', '\040', '\151', '\156', '\040', '\061', + '\012', '\144', '\121', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\121', '\171', '\040', '\160', '\162', '\040', '\061', + '\012', '\130', '\171', '\170', '\040', '\156', '\171', '\040', '\061', + '\012', '\163', '\127', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\106', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\142', '\160', '\106', '\040', '\160', '\162', '\040', '\061', + '\012', '\126', '\163', '\166', '\040', '\163', '\164', '\040', '\061', + '\012', '\121', '\161', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\172', '\124', '\040', '\163', '\172', '\040', '\061', + '\012', '\163', '\161', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\113', '\172', '\155', '\040', '\163', '\172', '\040', '\061', + '\012', '\157', '\106', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\153', '\112', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\153', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\114', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\155', '\125', '\040', '\155', '\145', '\040', '\061', + '\012', '\143', '\162', '\112', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\154', '\130', '\040', '\154', '\145', '\040', '\061', + '\012', '\124', '\172', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\142', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\160', '\111', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\103', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\106', '\155', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\121', '\150', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\121', '\163', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\122', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\131', '\143', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\152', '\120', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\165', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\111', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\153', '\127', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\112', '\167', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\126', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\152', '\161', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\172', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\103', '\167', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\105', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\162', '\130', '\040', '\145', '\162', '\040', '\061', + '\012', '\113', '\161', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\154', '\131', '\166', '\040', '\154', '\145', '\040', '\061', + '\012', '\144', '\107', '\166', '\040', '\144', '\145', '\040', '\061', + '\012', '\103', '\167', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\156', '\104', '\166', '\040', '\141', '\156', '\040', '\061', + '\012', '\117', '\152', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\104', '\156', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\162', '\106', '\040', '\145', '\162', '\040', '\061', + '\012', '\112', '\155', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\172', '\146', '\111', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\161', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\166', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\156', '\120', '\160', '\040', '\141', '\156', '\040', '\061', + '\012', '\141', '\126', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\102', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\153', '\126', '\142', '\040', '\153', '\141', '\040', '\061', + '\012', '\147', '\143', '\110', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\142', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\122', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\121', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\110', '\170', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\104', '\156', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\127', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\107', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\147', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\167', '\120', '\040', '\167', '\141', '\040', '\061', + '\012', '\156', '\162', '\127', '\040', '\141', '\156', '\040', '\061', + '\012', '\151', '\126', '\161', '\040', '\144', '\151', '\040', '\061', + '\012', '\170', '\172', '\105', '\040', '\163', '\172', '\040', '\061', + '\012', '\126', '\170', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\114', '\172', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\112', '\167', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\147', '\103', '\161', '\040', '\156', '\147', '\040', '\061', + '\012', '\117', '\164', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\166', '\120', '\040', '\166', '\141', '\040', '\061', + '\012', '\143', '\116', '\162', '\040', '\143', '\150', '\040', '\061', + '\012', '\151', '\130', '\161', '\040', '\151', '\156', '\040', '\061', + '\012', '\121', '\156', '\154', '\040', '\151', '\156', '\040', '\061', + '\012', '\164', '\120', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\111', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\141', '\120', '\147', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\166', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\156', '\161', '\117', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\161', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\152', '\121', '\040', '\151', '\152', '\040', '\061', + '\012', '\154', '\167', '\121', '\040', '\154', '\145', '\040', '\061', + '\012', '\160', '\105', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\127', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\163', '\167', '\124', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\155', '\131', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\122', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\132', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\115', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\154', '\170', '\117', '\040', '\154', '\145', '\040', '\061', + '\012', '\153', '\142', '\121', '\040', '\153', '\141', '\040', '\061', + '\012', '\171', '\146', '\116', '\040', '\156', '\171', '\040', '\061', + '\012', '\171', '\155', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\160', '\113', '\040', '\151', '\152', '\040', '\061', + '\012', '\127', '\152', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\155', '\127', '\040', '\155', '\145', '\040', '\061', + '\012', '\162', '\113', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\144', '\154', '\110', '\040', '\154', '\145', '\040', '\061', + '\012', '\153', '\143', '\113', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\142', '\126', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\116', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\110', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\154', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\102', '\166', '\040', '\154', '\145', '\040', '\061', + '\012', '\157', '\141', '\106', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\146', '\115', '\040', '\146', '\157', '\040', '\061', + '\012', '\162', '\132', '\144', '\040', '\145', '\162', '\040', '\061', + '\012', '\152', '\147', '\127', '\040', '\156', '\147', '\040', '\061', + '\012', '\110', '\166', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\153', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\143', '\104', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\114', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\121', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\150', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\166', '\121', '\040', '\151', '\156', '\040', '\061', + '\012', '\125', '\153', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\160', '\126', '\040', '\160', '\162', '\040', '\061', + '\012', '\142', '\112', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\141', '\120', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\144', '\113', '\040', '\144', '\145', '\040', '\061', + '\012', '\143', '\107', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\114', '\152', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\150', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\106', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\146', '\111', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\150', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\165', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\106', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\147', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\106', '\161', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\155', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\132', '\160', '\146', '\040', '\160', '\162', '\040', '\061', + '\012', '\156', '\106', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\102', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\147', '\111', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\102', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\125', '\167', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\162', '\115', '\040', '\145', '\162', '\040', '\061', + '\012', '\171', '\102', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\122', '\154', '\146', '\040', '\154', '\145', '\040', '\061', + '\012', '\120', '\172', '\150', '\040', '\143', '\150', '\040', '\061', + '\012', '\162', '\132', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\126', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\170', '\112', '\040', '\144', '\145', '\040', '\061', + '\012', '\114', '\143', '\172', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\106', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\111', '\155', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\164', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\142', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\110', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\162', '\131', '\040', '\145', '\162', '\040', '\061', + '\012', '\164', '\102', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\113', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\116', '\153', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\103', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\171', '\130', '\040', '\142', '\145', '\040', '\061', + '\012', '\157', '\102', '\160', '\040', '\157', '\156', '\040', '\061', + '\012', '\127', '\152', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\146', '\120', '\040', '\163', '\172', '\040', '\061', + '\012', '\141', '\121', '\172', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\152', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\156', '\146', '\127', '\040', '\141', '\156', '\040', '\061', + '\012', '\156', '\130', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\112', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\141', '\123', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\151', '\122', '\146', '\040', '\151', '\156', '\040', '\061', + '\012', '\171', '\115', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\102', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\170', '\122', '\040', '\166', '\141', '\040', '\061', + '\012', '\114', '\154', '\170', '\040', '\154', '\145', '\040', '\061', + '\012', '\171', '\107', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\112', '\163', '\171', '\040', '\163', '\172', '\040', '\061', + '\012', '\114', '\166', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\145', '\106', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\142', '\115', '\040', '\167', '\141', '\040', '\061', + '\012', '\165', '\117', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\127', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\142', '\166', '\125', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\156', '\117', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\172', '\111', '\040', '\163', '\172', '\040', '\061', + '\012', '\126', '\143', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\150', '\105', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\147', '\121', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\147', '\120', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\142', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\132', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\130', '\164', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\131', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\144', '\113', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\172', '\102', '\040', '\163', '\172', '\040', '\061', + '\012', '\131', '\171', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\125', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\102', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\161', '\152', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\130', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\130', '\161', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\124', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\162', '\105', '\040', '\145', '\162', '\040', '\061', + '\012', '\163', '\116', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\132', '\150', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\126', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\107', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\112', '\161', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\124', '\155', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\150', '\105', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\121', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\124', '\155', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\170', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\172', '\105', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\115', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\103', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\167', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\126', '\172', '\040', '\141', '\156', '\040', '\061', + '\012', '\154', '\122', '\153', '\040', '\154', '\145', '\040', '\061', + '\012', '\117', '\167', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\131', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\121', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\116', '\154', '\146', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\104', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\110', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\143', '\152', '\101', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\147', '\125', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\121', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\171', '\116', '\146', '\040', '\156', '\171', '\040', '\061', + '\012', '\154', '\167', '\132', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\107', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\126', '\155', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\160', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\106', '\144', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\110', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\142', '\123', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\105', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\145', '\167', '\121', '\040', '\145', '\162', '\040', '\061', + '\012', '\145', '\127', '\144', '\040', '\145', '\162', '\040', '\061', + '\012', '\152', '\146', '\122', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\160', '\131', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\166', '\121', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\130', '\162', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\112', '\167', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\105', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\116', '\170', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\115', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\107', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\171', '\121', '\040', '\160', '\162', '\040', '\061', + '\012', '\152', '\160', '\125', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\157', '\101', '\040', '\157', '\156', '\040', '\061', + '\012', '\147', '\130', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\161', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\130', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\154', '\120', '\040', '\154', '\145', '\040', '\061', + '\012', '\114', '\172', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\170', '\102', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\112', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\143', '\124', '\040', '\143', '\150', '\040', '\061', + '\012', '\127', '\164', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\114', '\147', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\125', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\156', '\106', '\160', '\040', '\141', '\156', '\040', '\061', + '\012', '\112', '\163', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\163', '\102', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\106', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\166', '\103', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\106', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\161', '\156', '\101', '\040', '\141', '\156', '\040', '\061', + '\012', '\132', '\142', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\120', '\172', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\163', '\112', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\132', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\146', '\120', '\040', '\156', '\171', '\040', '\061', + '\012', '\147', '\131', '\166', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\146', '\103', '\040', '\142', '\145', '\040', '\061', + '\012', '\144', '\115', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\150', '\154', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\122', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\152', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\152', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\121', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\124', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\125', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\161', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\154', '\122', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\161', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\167', '\122', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\115', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\172', '\153', '\124', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\161', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\154', '\122', '\040', '\141', '\156', '\040', '\061', + '\012', '\110', '\161', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\141', '\141', '\112', '\040', '\141', '\156', '\040', '\061', + '\012', '\154', '\113', '\167', '\040', '\154', '\145', '\040', '\061', + '\012', '\142', '\172', '\102', '\040', '\163', '\172', '\040', '\061', + '\012', '\126', '\147', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\141', '\126', '\155', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\156', '\122', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\170', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\172', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\172', '\170', '\126', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\147', '\121', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\166', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\167', '\116', '\040', '\151', '\152', '\040', '\061', + '\012', '\105', '\161', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\102', '\170', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\150', '\172', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\146', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\120', '\160', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\101', '\161', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\112', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\172', '\106', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\146', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\172', '\126', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\147', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\163', '\123', '\040', '\163', '\172', '\040', '\061', + '\012', '\156', '\121', '\172', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\153', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\150', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\112', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\117', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\162', '\161', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\131', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\165', '\106', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\116', '\143', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\115', '\167', '\040', '\154', '\145', '\040', '\061', + '\012', '\143', '\152', '\111', '\040', '\143', '\150', '\040', '\061', + '\012', '\112', '\143', '\167', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\105', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\145', '\121', '\171', '\040', '\145', '\162', '\040', '\061', + '\012', '\123', '\170', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\125', '\170', '\040', '\155', '\142', '\040', '\061', + '\012', '\172', '\144', '\112', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\160', '\116', '\040', '\154', '\145', '\040', '\061', + '\012', '\122', '\153', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\166', '\111', '\040', '\166', '\141', '\040', '\061', + '\012', '\121', '\155', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\147', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\146', '\105', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\143', '\130', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\154', '\124', '\040', '\154', '\145', '\040', '\061', + '\012', '\142', '\142', '\126', '\040', '\142', '\145', '\040', '\061', + '\012', '\160', '\155', '\132', '\040', '\155', '\145', '\040', '\061', + '\012', '\165', '\161', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\131', '\171', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\155', '\131', '\040', '\155', '\145', '\040', '\061', + '\012', '\172', '\154', '\102', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\116', '\144', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\166', '\132', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\166', '\114', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\114', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\143', '\107', '\040', '\143', '\150', '\040', '\061', + '\012', '\121', '\152', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\156', '\161', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\170', '\131', '\040', '\156', '\147', '\040', '\061', + '\012', '\141', '\161', '\111', '\040', '\141', '\156', '\040', '\061', + '\012', '\113', '\161', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\130', '\161', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\166', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\161', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\110', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\110', '\143', '\040', '\141', '\156', '\040', '\061', + '\012', '\125', '\161', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\146', '\116', '\040', '\163', '\172', '\040', '\061', + '\012', '\155', '\130', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\106', '\147', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\104', '\163', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\122', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\142', '\132', '\040', '\167', '\141', '\040', '\061', + '\012', '\110', '\156', '\160', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\125', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\143', '\131', '\144', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\124', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\102', '\147', '\161', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\103', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\130', '\155', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\152', '\112', '\040', '\151', '\152', '\040', '\061', + '\012', '\164', '\144', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\150', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\106', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\153', '\121', '\040', '\144', '\145', '\040', '\061', + '\012', '\114', '\143', '\147', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\111', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\111', '\167', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\152', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\142', '\130', '\040', '\163', '\172', '\040', '\061', + '\012', '\131', '\150', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\166', '\110', '\040', '\143', '\150', '\040', '\061', + '\012', '\114', '\143', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\127', '\146', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\116', '\146', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\115', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\125', '\166', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\121', '\156', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\142', '\107', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\106', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\154', '\112', '\040', '\154', '\145', '\040', '\061', + '\012', '\142', '\120', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\170', '\160', '\111', '\040', '\160', '\162', '\040', '\061', + '\012', '\155', '\162', '\126', '\040', '\145', '\162', '\040', '\061', + '\012', '\106', '\167', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\117', '\171', '\040', '\167', '\141', '\040', '\061', + '\012', '\120', '\155', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\150', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\142', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\160', '\147', '\131', '\040', '\156', '\147', '\040', '\061', + '\012', '\122', '\142', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\101', '\167', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\155', '\143', '\102', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\153', '\107', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\153', '\127', '\040', '\153', '\141', '\040', '\061', + '\012', '\120', '\156', '\167', '\040', '\151', '\156', '\040', '\061', + '\012', '\142', '\116', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\156', '\130', '\162', '\040', '\141', '\156', '\040', '\061', + '\012', '\126', '\155', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\145', '\125', '\166', '\040', '\145', '\162', '\040', '\061', + '\012', '\171', '\121', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\153', '\170', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\113', '\163', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\160', '\127', '\040', '\160', '\162', '\040', '\061', + '\012', '\161', '\145', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\166', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\122', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\112', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\163', '\131', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\167', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\103', '\161', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\131', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\120', '\160', '\040', '\144', '\145', '\040', '\061', + '\012', '\157', '\101', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\144', '\143', '\123', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\167', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\152', '\114', '\040', '\163', '\172', '\040', '\061', + '\012', '\157', '\132', '\170', '\040', '\157', '\156', '\040', '\061', + '\012', '\153', '\152', '\122', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\104', '\171', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\123', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\145', '\121', '\146', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\102', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\114', '\142', '\040', '\155', '\145', '\040', '\061', + '\012', '\132', '\162', '\152', '\040', '\145', '\162', '\040', '\061', + '\012', '\107', '\153', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\160', '\153', '\130', '\040', '\153', '\141', '\040', '\061', + '\012', '\166', '\124', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\132', '\147', '\160', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\150', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\120', '\166', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\156', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\110', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\130', '\147', '\146', '\040', '\156', '\147', '\040', '\061', + '\012', '\103', '\167', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\154', '\142', '\116', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\116', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\116', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\112', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\157', '\112', '\144', '\040', '\157', '\156', '\040', '\061', + '\012', '\122', '\171', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\166', '\114', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\166', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\167', '\103', '\040', '\166', '\141', '\040', '\061', + '\012', '\153', '\106', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\110', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\143', '\102', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\124', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\121', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\104', '\154', '\146', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\114', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\142', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\161', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\150', '\117', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\117', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\155', '\161', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\155', '\121', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\121', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\166', '\121', '\040', '\157', '\156', '\040', '\061', + '\012', '\147', '\146', '\122', '\040', '\156', '\147', '\040', '\061', + '\012', '\120', '\155', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\124', '\143', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\161', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\167', '\126', '\040', '\155', '\145', '\040', '\061', + '\012', '\142', '\130', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\152', '\154', '\101', '\040', '\154', '\145', '\040', '\061', + '\012', '\146', '\152', '\107', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\170', '\131', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\167', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\166', '\125', '\040', '\153', '\141', '\040', '\061', + '\012', '\102', '\153', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\146', '\101', '\040', '\156', '\147', '\040', '\061', + '\012', '\101', '\167', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\126', '\155', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\121', '\150', '\154', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\155', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\115', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\110', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\120', '\142', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\154', '\113', '\040', '\154', '\145', '\040', '\061', + '\012', '\131', '\147', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\112', '\163', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\127', '\154', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\126', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\163', '\162', '\116', '\040', '\145', '\162', '\040', '\061', + '\012', '\125', '\150', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\146', '\122', '\040', '\166', '\141', '\040', '\061', + '\012', '\153', '\106', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\112', '\154', '\172', '\040', '\154', '\145', '\040', '\061', + '\012', '\146', '\113', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\122', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\127', '\167', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\166', '\117', '\040', '\163', '\172', '\040', '\061', + '\012', '\130', '\161', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\111', '\152', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\112', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\106', '\161', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\116', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\170', '\114', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\114', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\144', '\161', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\122', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\114', '\152', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\122', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\143', '\170', '\102', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\152', '\110', '\040', '\143', '\150', '\040', '\061', + '\012', '\126', '\161', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\112', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\106', '\153', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\161', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\105', '\161', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\122', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\146', '\124', '\040', '\166', '\141', '\040', '\061', + '\012', '\132', '\161', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\107', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\123', '\142', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\151', '\167', '\126', '\040', '\151', '\156', '\040', '\061', + '\012', '\152', '\146', '\111', '\040', '\151', '\152', '\040', '\061', + '\012', '\156', '\127', '\172', '\040', '\141', '\156', '\040', '\061', + '\012', '\114', '\152', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\162', '\152', '\107', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\106', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\161', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\126', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\152', '\147', '\113', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\132', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\102', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\165', '\107', '\040', '\165', '\156', '\040', '\061', + '\012', '\154', '\103', '\166', '\040', '\154', '\145', '\040', '\061', + '\012', '\154', '\170', '\127', '\040', '\154', '\145', '\040', '\061', + '\012', '\147', '\107', '\142', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\166', '\131', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\152', '\106', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\164', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\131', '\171', '\040', '\160', '\162', '\040', '\061', + '\012', '\131', '\162', '\146', '\040', '\145', '\162', '\040', '\061', + '\012', '\155', '\126', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\160', '\122', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\113', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\167', '\160', '\115', '\040', '\160', '\162', '\040', '\061', + '\012', '\143', '\114', '\153', '\040', '\143', '\150', '\040', '\061', + '\012', '\123', '\161', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\127', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\127', '\172', '\040', '\163', '\164', '\040', '\061', + '\012', '\163', '\162', '\123', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\126', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\116', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\150', '\120', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\107', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\144', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\112', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\125', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\144', '\112', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\150', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\164', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\107', '\142', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\104', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\146', '\127', '\040', '\163', '\172', '\040', '\061', + '\012', '\116', '\155', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\110', '\163', '\167', '\040', '\163', '\164', '\040', '\061', + '\012', '\160', '\146', '\107', '\040', '\160', '\162', '\040', '\061', + '\012', '\144', '\115', '\152', '\040', '\144', '\145', '\040', '\061', + '\012', '\153', '\113', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\152', '\123', '\040', '\145', '\162', '\040', '\061', + '\012', '\121', '\154', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\116', '\146', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\143', '\161', '\115', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\127', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\165', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\146', '\106', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\147', '\110', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\160', '\132', '\040', '\160', '\162', '\040', '\061', + '\012', '\142', '\164', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\161', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\171', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\162', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\171', '\164', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\110', '\155', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\102', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\171', '\116', '\040', '\156', '\171', '\040', '\061', + '\012', '\121', '\162', '\152', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\113', '\144', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\146', '\125', '\040', '\142', '\145', '\040', '\061', + '\012', '\121', '\146', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\161', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\117', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\150', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\161', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\152', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\131', '\146', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\141', '\130', '\153', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\142', '\126', '\040', '\160', '\162', '\040', '\061', + '\012', '\166', '\152', '\120', '\040', '\151', '\152', '\040', '\061', + '\012', '\131', '\142', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\112', '\155', '\142', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\106', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\120', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\127', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\166', '\150', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\167', '\124', '\040', '\151', '\156', '\040', '\061', + '\012', '\161', '\132', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\161', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\106', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\160', '\127', '\040', '\143', '\150', '\040', '\061', + '\012', '\114', '\160', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\146', '\114', '\040', '\153', '\141', '\040', '\061', + '\012', '\160', '\121', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\167', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\160', '\115', '\040', '\151', '\152', '\040', '\061', + '\012', '\121', '\153', '\155', '\040', '\153', '\141', '\040', '\061', + '\012', '\152', '\147', '\110', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\152', '\120', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\147', '\114', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\114', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\144', '\170', '\116', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\127', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\112', '\152', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\150', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\131', '\166', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\162', '\105', '\040', '\145', '\162', '\040', '\061', + '\012', '\142', '\132', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\114', '\166', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\145', '\116', '\167', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\152', '\102', '\040', '\151', '\152', '\040', '\061', + '\012', '\144', '\143', '\121', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\132', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\167', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\120', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\115', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\150', '\146', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\172', '\121', '\040', '\163', '\172', '\040', '\061', + '\012', '\125', '\165', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\107', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\103', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\156', '\160', '\103', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\127', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\152', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\120', '\172', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\167', '\165', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\150', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\115', '\161', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\163', '\111', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\144', '\125', '\040', '\144', '\145', '\040', '\061', + '\012', '\130', '\162', '\155', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\121', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\153', '\127', '\040', '\153', '\141', '\040', '\061', + '\012', '\144', '\110', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\162', '\143', '\102', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\127', '\165', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\111', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\162', '\131', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\130', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\161', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\155', '\116', '\040', '\155', '\145', '\040', '\061', + '\012', '\163', '\112', '\146', '\040', '\163', '\164', '\040', '\061', + '\012', '\171', '\115', '\146', '\040', '\156', '\171', '\040', '\061', + '\012', '\123', '\146', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\172', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\166', '\124', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\155', '\130', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\161', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\156', '\107', '\040', '\141', '\156', '\040', '\061', + '\012', '\112', '\160', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\146', '\162', '\130', '\040', '\145', '\162', '\040', '\061', + '\012', '\171', '\114', '\146', '\040', '\156', '\171', '\040', '\061', + '\012', '\165', '\171', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\104', '\144', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\124', '\147', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\145', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\105', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\103', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\155', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\152', '\110', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\115', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\131', '\167', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\172', '\147', '\104', '\040', '\156', '\147', '\040', '\061', + '\012', '\120', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\161', '\115', '\040', '\157', '\156', '\040', '\061', + '\012', '\167', '\144', '\130', '\040', '\144', '\145', '\040', '\061', + '\012', '\102', '\160', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\150', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\105', '\160', '\142', '\040', '\160', '\162', '\040', '\061', + '\012', '\142', '\150', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\166', '\121', '\040', '\153', '\141', '\040', '\061', + '\012', '\122', '\163', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\142', '\120', '\040', '\142', '\145', '\040', '\061', + '\012', '\156', '\115', '\155', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\165', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\152', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\170', '\130', '\040', '\146', '\157', '\040', '\061', + '\012', '\150', '\166', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\120', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\155', '\171', '\040', '\155', '\145', '\040', '\061', + '\012', '\121', '\172', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\116', '\163', '\172', '\040', '\163', '\164', '\040', '\061', + '\012', '\166', '\127', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\150', '\146', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\103', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\121', '\170', '\040', '\156', '\171', '\040', '\061', + '\012', '\167', '\150', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\162', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\147', '\127', '\040', '\156', '\147', '\040', '\061', + '\012', '\112', '\150', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\150', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\120', '\167', '\146', '\040', '\157', '\167', '\040', '\061', + '\012', '\154', '\152', '\103', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\166', '\102', '\040', '\166', '\141', '\040', '\061', + '\012', '\155', '\143', '\116', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\110', '\170', '\040', '\156', '\171', '\040', '\061', + '\012', '\142', '\102', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\122', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\154', '\110', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\132', '\160', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\112', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\123', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\126', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\165', '\127', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\170', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\146', '\152', '\115', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\150', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\103', '\152', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\132', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\142', '\103', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\162', '\167', '\131', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\105', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\144', '\125', '\166', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\122', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\107', '\143', '\165', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\104', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\144', '\152', '\110', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\154', '\125', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\171', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\146', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\130', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\154', '\142', '\103', '\040', '\154', '\145', '\040', '\061', + '\012', '\120', '\167', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\117', '\141', '\145', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\142', '\103', '\040', '\160', '\162', '\040', '\061', + '\012', '\144', '\127', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\172', '\125', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\112', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\131', '\152', '\040', '\144', '\145', '\040', '\061', + '\012', '\143', '\102', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\122', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\144', '\152', '\107', '\040', '\144', '\145', '\040', '\061', + '\012', '\155', '\131', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\121', '\142', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\156', '\130', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\120', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\167', '\166', '\116', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\107', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\116', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\122', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\125', '\161', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\170', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\146', '\172', '\130', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\152', '\115', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\161', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\115', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\155', '\114', '\040', '\155', '\145', '\040', '\061', + '\012', '\105', '\171', '\170', '\040', '\156', '\171', '\040', '\061', + '\012', '\150', '\110', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\107', '\160', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\146', '\104', '\040', '\155', '\145', '\040', '\061', + '\012', '\112', '\146', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\127', '\152', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\132', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\111', '\171', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\122', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\144', '\125', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\112', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\152', '\171', '\040', '\151', '\152', '\040', '\061', + '\012', '\121', '\141', '\157', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\130', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\123', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\101', '\157', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\114', '\163', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\103', '\163', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\153', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\170', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\144', '\116', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\131', '\170', '\040', '\156', '\171', '\040', '\061', + '\012', '\144', '\153', '\116', '\040', '\144', '\145', '\040', '\061', + '\012', '\122', '\147', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\147', '\114', '\040', '\163', '\172', '\040', '\061', + '\012', '\122', '\143', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\151', '\127', '\172', '\040', '\151', '\156', '\040', '\061', + '\012', '\144', '\114', '\153', '\040', '\144', '\145', '\040', '\061', + '\012', '\155', '\160', '\130', '\040', '\155', '\145', '\040', '\061', + '\012', '\107', '\142', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\142', '\156', '\110', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\144', '\115', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\161', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\115', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\167', '\110', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\147', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\114', '\152', '\153', '\040', '\151', '\152', '\040', '\061', + '\012', '\164', '\154', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\147', '\105', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\143', '\167', '\040', '\143', '\150', '\040', '\061', + '\012', '\126', '\142', '\171', '\040', '\142', '\145', '\040', '\061', + '\012', '\155', '\126', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\110', '\147', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\161', '\120', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\150', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\106', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\102', '\146', '\040', '\156', '\171', '\040', '\061', + '\012', '\127', '\155', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\166', '\116', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\115', '\156', '\166', '\040', '\141', '\156', '\040', '\061', + '\012', '\132', '\155', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\172', '\123', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\146', '\103', '\040', '\156', '\171', '\040', '\061', + '\012', '\105', '\160', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\154', '\152', '\107', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\125', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\121', '\147', '\157', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\161', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\153', '\155', '\040', '\153', '\141', '\040', '\061', + '\012', '\127', '\166', '\171', '\040', '\166', '\141', '\040', '\061', + '\012', '\102', '\152', '\160', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\146', '\132', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\170', '\124', '\040', '\167', '\141', '\040', '\061', + '\012', '\126', '\170', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\144', '\122', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\126', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\151', '\127', '\146', '\040', '\151', '\156', '\040', '\061', + '\012', '\123', '\155', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\167', '\107', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\143', '\127', '\040', '\143', '\150', '\040', '\061', + '\012', '\121', '\147', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\127', '\153', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\162', '\114', '\040', '\145', '\162', '\040', '\061', + '\012', '\164', '\126', '\150', '\040', '\143', '\150', '\040', '\061', + '\012', '\132', '\154', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\172', '\104', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\170', '\120', '\040', '\156', '\171', '\040', '\061', + '\012', '\131', '\171', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\172', '\120', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\102', '\147', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\117', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\157', '\130', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\121', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\170', '\106', '\040', '\146', '\157', '\040', '\061', + '\012', '\144', '\117', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\164', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\150', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\150', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\107', '\161', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\106', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\145', '\103', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\152', '\110', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\161', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\160', '\114', '\040', '\151', '\152', '\040', '\061', + '\012', '\150', '\147', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\106', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\121', '\152', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\113', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\172', '\121', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\116', '\150', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\113', '\161', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\167', '\117', '\040', '\164', '\150', '\040', '\061', + '\012', '\157', '\131', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\127', '\156', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\123', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\101', '\146', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\161', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\105', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\113', '\160', '\040', '\144', '\145', '\040', '\061', + '\012', '\156', '\155', '\113', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\130', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\166', '\152', '\103', '\040', '\151', '\152', '\040', '\061', + '\012', '\144', '\130', '\142', '\040', '\144', '\145', '\040', '\061', + '\012', '\164', '\121', '\156', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\157', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\122', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\171', '\171', '\114', '\040', '\156', '\171', '\040', '\061', + '\012', '\153', '\123', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\130', '\171', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\155', '\101', '\040', '\166', '\141', '\040', '\061', + '\012', '\132', '\147', '\155', '\040', '\156', '\147', '\040', '\061', + '\012', '\114', '\142', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\142', '\111', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\132', '\144', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\110', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\131', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\115', '\161', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\115', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\163', '\166', '\040', '\163', '\164', '\040', '\061', + '\012', '\172', '\130', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\121', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\143', '\126', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\146', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\115', '\150', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\102', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\127', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\127', '\172', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\127', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\116', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\170', '\142', '\132', '\040', '\142', '\145', '\040', '\061', + '\012', '\155', '\124', '\142', '\040', '\155', '\145', '\040', '\061', + '\012', '\113', '\144', '\146', '\040', '\144', '\145', '\040', '\061', + '\012', '\160', '\146', '\121', '\040', '\160', '\162', '\040', '\061', + '\012', '\166', '\103', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\120', '\161', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\146', '\132', '\040', '\157', '\156', '\040', '\061', + '\012', '\167', '\131', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\124', '\146', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\107', '\156', '\142', '\040', '\141', '\156', '\040', '\061', + '\012', '\132', '\144', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\126', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\124', '\161', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\172', '\126', '\040', '\163', '\172', '\040', '\061', + '\012', '\111', '\147', '\161', '\040', '\156', '\147', '\040', '\061', + '\012', '\121', '\166', '\166', '\040', '\166', '\151', '\040', '\061', + '\012', '\120', '\155', '\146', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\110', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\142', '\122', '\040', '\142', '\145', '\040', '\061', + '\012', '\143', '\106', '\147', '\040', '\143', '\150', '\040', '\061', + '\012', '\113', '\166', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\132', '\170', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\157', '\126', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\131', '\150', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\167', '\120', '\040', '\167', '\141', '\040', '\061', + '\012', '\126', '\166', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\163', '\144', '\127', '\040', '\144', '\145', '\040', '\061', + '\012', '\147', '\106', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\122', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\142', '\161', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\150', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\102', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\142', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\112', '\172', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\162', '\123', '\040', '\145', '\162', '\040', '\061', + '\012', '\155', '\153', '\132', '\040', '\155', '\145', '\040', '\061', + '\012', '\142', '\113', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\152', '\120', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\130', '\161', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\107', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\114', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\156', '\162', '\126', '\040', '\141', '\156', '\040', '\061', + '\012', '\124', '\155', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\172', '\166', '\132', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\127', '\154', '\040', '\156', '\147', '\040', '\061', + '\012', '\131', '\170', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\171', '\127', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\161', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\127', '\165', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\132', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\161', '\111', '\040', '\151', '\156', '\040', '\061', + '\012', '\143', '\160', '\121', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\120', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\161', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\155', '\111', '\040', '\156', '\147', '\040', '\061', + '\012', '\127', '\153', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\132', '\166', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\144', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\131', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\102', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\104', '\167', '\142', '\040', '\157', '\167', '\040', '\061', + '\012', '\127', '\172', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\144', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\166', '\122', '\040', '\163', '\172', '\040', '\061', + '\012', '\116', '\166', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\122', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\104', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\107', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\167', '\124', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\124', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\103', '\166', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\154', '\121', '\040', '\154', '\145', '\040', '\061', + '\012', '\155', '\127', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\167', '\123', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\160', '\115', '\040', '\141', '\156', '\040', '\061', + '\012', '\125', '\146', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\165', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\103', '\152', '\040', '\157', '\156', '\040', '\061', + '\012', '\164', '\170', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\131', '\146', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\167', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\144', '\172', '\040', '\144', '\145', '\040', '\061', + '\012', '\126', '\147', '\161', '\040', '\156', '\147', '\040', '\061', + '\012', '\122', '\153', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\120', '\170', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\155', '\103', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\150', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\147', '\102', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\166', '\127', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\144', '\114', '\040', '\144', '\145', '\040', '\061', + '\012', '\114', '\170', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\163', '\166', '\102', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\165', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\106', '\171', '\040', '\156', '\147', '\040', '\061', + '\012', '\157', '\126', '\166', '\040', '\157', '\156', '\040', '\061', + '\012', '\132', '\150', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\157', '\161', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\112', '\160', '\040', '\157', '\156', '\040', '\061', + '\012', '\147', '\111', '\146', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\167', '\106', '\040', '\167', '\141', '\040', '\061', + '\012', '\166', '\114', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\147', '\130', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\113', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\170', '\122', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\167', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\116', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\107', '\166', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\121', '\146', '\040', '\160', '\162', '\040', '\061', + '\012', '\170', '\142', '\126', '\040', '\142', '\145', '\040', '\061', + '\012', '\144', '\160', '\132', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\110', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\102', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\125', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\172', '\101', '\040', '\164', '\150', '\040', '\061', + '\012', '\115', '\156', '\172', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\102', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\157', '\141', '\105', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\154', '\113', '\040', '\154', '\145', '\040', '\061', + '\012', '\127', '\154', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\150', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\166', '\130', '\040', '\166', '\141', '\040', '\061', + '\012', '\106', '\146', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\147', '\130', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\127', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\107', '\160', '\171', '\040', '\160', '\162', '\040', '\061', + '\012', '\170', '\155', '\123', '\040', '\155', '\145', '\040', '\061', + '\012', '\147', '\132', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\152', '\130', '\040', '\144', '\145', '\040', '\061', + '\012', '\142', '\153', '\130', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\154', '\120', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\103', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\131', '\150', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\167', '\121', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\154', '\104', '\040', '\154', '\145', '\040', '\061', + '\012', '\122', '\150', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\141', '\105', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\160', '\131', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\126', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\156', '\112', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\144', '\126', '\040', '\144', '\145', '\040', '\061', + '\012', '\122', '\166', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\117', '\161', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\160', '\124', '\040', '\163', '\172', '\040', '\061', + '\012', '\120', '\172', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\124', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\146', '\161', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\164', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\161', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\132', '\142', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\110', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\121', '\143', '\162', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\126', '\155', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\116', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\130', '\150', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\157', '\131', '\171', '\040', '\157', '\156', '\040', '\061', + '\012', '\106', '\154', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\167', '\152', '\040', '\154', '\145', '\040', '\061', + '\012', '\162', '\167', '\110', '\040', '\145', '\162', '\040', '\061', + '\012', '\157', '\127', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\102', '\167', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\152', '\130', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\114', '\153', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\126', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\130', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\153', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\162', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\161', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\170', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\147', '\132', '\040', '\156', '\147', '\040', '\061', + '\012', '\106', '\147', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\167', '\115', '\040', '\141', '\156', '\040', '\061', + '\012', '\127', '\172', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\147', '\142', '\040', '\156', '\147', '\040', '\061', + '\012', '\131', '\147', '\166', '\040', '\156', '\147', '\040', '\061', + '\012', '\130', '\144', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\152', '\115', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\110', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\113', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\166', '\115', '\040', '\144', '\145', '\040', '\061', + '\012', '\132', '\160', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\167', '\120', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\151', '\101', '\040', '\151', '\156', '\040', '\061', + '\012', '\152', '\171', '\126', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\171', '\122', '\040', '\151', '\152', '\040', '\061', + '\012', '\125', '\157', '\170', '\040', '\157', '\156', '\040', '\061', + '\012', '\121', '\153', '\172', '\040', '\153', '\141', '\040', '\061', + '\012', '\114', '\170', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\160', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\155', '\146', '\040', '\155', '\145', '\040', '\061', + '\012', '\153', '\122', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\152', '\106', '\153', '\040', '\151', '\152', '\040', '\061', + '\012', '\156', '\132', '\143', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\103', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\142', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\172', '\154', '\106', '\040', '\154', '\145', '\040', '\061', + '\012', '\153', '\161', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\127', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\113', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\160', '\146', '\040', '\160', '\162', '\040', '\061', + '\012', '\154', '\142', '\122', '\040', '\154', '\145', '\040', '\061', + '\012', '\162', '\142', '\112', '\040', '\145', '\162', '\040', '\061', + '\012', '\172', '\146', '\113', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\126', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\132', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\172', '\156', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\132', '\142', '\040', '\147', '\141', '\040', '\061', + '\012', '\167', '\164', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\166', '\127', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\150', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\162', '\126', '\040', '\145', '\162', '\040', '\061', + '\012', '\160', '\131', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\121', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\160', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\106', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\172', '\144', '\117', '\040', '\144', '\145', '\040', '\061', + '\012', '\112', '\166', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\121', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\127', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\104', '\164', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\113', '\172', '\040', '\154', '\145', '\040', '\061', + '\012', '\144', '\153', '\111', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\123', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\171', '\103', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\167', '\150', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\126', '\155', '\040', '\154', '\145', '\040', '\061', + '\012', '\171', '\110', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\120', '\154', '\155', '\040', '\154', '\145', '\040', '\061', + '\012', '\112', '\160', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\150', '\105', '\167', '\040', '\150', '\141', '\040', '\061', + '\012', '\172', '\110', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\165', '\111', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\172', '\102', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\163', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\142', '\130', '\040', '\160', '\162', '\040', '\061', + '\012', '\152', '\171', '\131', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\104', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\124', '\161', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\124', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\142', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\103', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\143', '\127', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\150', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\167', '\122', '\040', '\167', '\141', '\040', '\061', + '\012', '\144', '\121', '\155', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\103', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\171', '\150', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\154', '\121', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\126', '\142', '\040', '\156', '\147', '\040', '\061', + '\012', '\120', '\144', '\171', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\117', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\132', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\157', '\161', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\161', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\153', '\130', '\040', '\151', '\152', '\040', '\061', + '\012', '\113', '\146', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\160', '\121', '\040', '\160', '\162', '\040', '\061', + '\012', '\162', '\150', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\152', '\111', '\040', '\151', '\152', '\040', '\061', + '\012', '\102', '\161', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\141', '\103', '\160', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\143', '\130', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\107', '\155', '\040', '\155', '\141', '\040', '\061', + '\012', '\160', '\141', '\125', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\125', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\114', '\144', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\146', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\167', '\110', '\040', '\167', '\141', '\040', '\061', + '\012', '\120', '\156', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\170', '\126', '\040', '\153', '\141', '\040', '\061', + '\012', '\116', '\142', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\163', '\161', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\103', '\152', '\160', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\143', '\132', '\040', '\153', '\141', '\040', '\061', + '\012', '\127', '\161', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\164', '\172', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\161', '\130', '\040', '\141', '\156', '\040', '\061', + '\012', '\131', '\171', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\114', '\172', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\132', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\163', '\144', '\131', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\130', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\116', '\142', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\167', '\114', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\116', '\161', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\167', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\171', '\166', '\110', '\040', '\166', '\141', '\040', '\061', + '\012', '\171', '\154', '\103', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\171', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\156', '\172', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\110', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\125', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\147', '\111', '\040', '\156', '\147', '\040', '\061', + '\012', '\132', '\164', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\166', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\164', '\107', '\156', '\040', '\164', '\150', '\040', '\061', + '\012', '\125', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\110', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\127', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\130', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\106', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\144', '\124', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\110', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\103', '\152', '\040', '\154', '\145', '\040', '\061', + '\012', '\155', '\126', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\121', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\127', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\171', '\106', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\152', '\131', '\040', '\144', '\145', '\040', '\061', + '\012', '\142', '\164', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\154', '\115', '\040', '\154', '\145', '\040', '\061', + '\012', '\111', '\167', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\120', '\144', '\142', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\164', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\152', '\122', '\040', '\151', '\152', '\040', '\061', + '\012', '\144', '\150', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\130', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\142', '\105', '\040', '\142', '\145', '\040', '\061', + '\012', '\110', '\161', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\114', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\142', '\104', '\040', '\153', '\141', '\040', '\061', + '\012', '\166', '\125', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\132', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\121', '\153', '\145', '\040', '\154', '\145', '\040', '\061', + '\012', '\146', '\150', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\145', '\110', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\110', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\124', '\146', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\165', '\157', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\103', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\114', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\144', '\127', '\040', '\144', '\145', '\040', '\061', + '\012', '\103', '\147', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\114', '\162', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\117', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\161', '\117', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\161', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\164', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\167', '\125', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\131', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\172', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\156', '\127', '\166', '\040', '\141', '\156', '\040', '\061', + '\012', '\154', '\116', '\170', '\040', '\154', '\145', '\040', '\061', + '\012', '\127', '\161', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\143', '\104', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\146', '\104', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\126', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\172', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\146', '\110', '\040', '\151', '\152', '\040', '\061', + '\012', '\122', '\162', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\104', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\117', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\167', '\132', '\040', '\167', '\141', '\040', '\061', + '\012', '\155', '\121', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\156', '\161', '\113', '\040', '\141', '\156', '\040', '\061', + '\012', '\125', '\166', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\153', '\122', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\150', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\163', '\104', '\040', '\163', '\164', '\040', '\061', + '\012', '\114', '\144', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\121', '\166', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\115', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\142', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\152', '\130', '\040', '\143', '\150', '\040', '\061', + '\012', '\156', '\142', '\124', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\116', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\167', '\103', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\156', '\130', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\132', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\103', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\110', '\153', '\040', '\144', '\145', '\040', '\061', + '\012', '\103', '\143', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\115', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\166', '\107', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\120', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\111', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\154', '\110', '\170', '\040', '\154', '\145', '\040', '\061', + '\012', '\146', '\156', '\102', '\040', '\141', '\156', '\040', '\061', + '\012', '\105', '\142', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\162', '\107', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\147', '\104', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\112', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\143', '\107', '\040', '\143', '\150', '\040', '\061', + '\012', '\131', '\142', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\157', '\104', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\122', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\112', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\164', '\106', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\107', '\144', '\166', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\110', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\125', '\161', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\131', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\110', '\160', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\150', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\132', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\121', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\167', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\172', '\125', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\121', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\142', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\126', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\112', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\162', '\146', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\115', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\112', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\104', '\161', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\115', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\172', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\127', '\144', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\124', '\144', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\155', '\143', '\124', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\117', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\113', '\147', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\162', '\124', '\040', '\145', '\162', '\040', '\061', + '\012', '\142', '\161', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\156', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\114', '\172', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\114', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\114', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\172', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\121', '\162', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\145', '\106', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\116', '\155', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\160', '\170', '\105', '\040', '\160', '\162', '\040', '\061', + '\012', '\103', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\143', '\144', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\130', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\146', '\142', '\125', '\040', '\142', '\145', '\040', '\061', + '\012', '\141', '\145', '\117', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\166', '\126', '\040', '\163', '\164', '\040', '\061', + '\012', '\171', '\126', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\122', '\160', '\040', '\163', '\164', '\040', '\061', + '\012', '\162', '\170', '\125', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\150', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\121', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\130', '\167', '\040', '\157', '\156', '\040', '\061', + '\012', '\112', '\166', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\153', '\166', '\110', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\126', '\171', '\040', '\163', '\172', '\040', '\061', + '\012', '\162', '\117', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\127', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\151', '\130', '\166', '\040', '\151', '\156', '\040', '\061', + '\012', '\143', '\102', '\153', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\153', '\115', '\040', '\153', '\141', '\040', '\061', + '\012', '\166', '\110', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\142', '\127', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\131', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\156', '\110', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\122', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\166', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\157', '\115', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\161', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\102', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\157', '\120', '\152', '\040', '\157', '\156', '\040', '\061', + '\012', '\146', '\106', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\126', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\164', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\116', '\164', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\167', '\114', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\106', '\172', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\126', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\107', '\142', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\157', '\112', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\153', '\114', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\157', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\170', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\162', '\132', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\103', '\147', '\144', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\166', '\127', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\131', '\166', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\152', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\156', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\112', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\127', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\142', '\130', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\126', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\165', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\110', '\172', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\165', '\104', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\167', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\112', '\153', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\107', '\144', '\155', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\143', '\117', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\154', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\146', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\143', '\114', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\172', '\107', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\150', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\146', '\104', '\040', '\153', '\141', '\040', '\061', + '\012', '\153', '\142', '\112', '\040', '\153', '\141', '\040', '\061', + '\012', '\116', '\161', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\131', '\161', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\164', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\143', '\104', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\147', '\131', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\144', '\124', '\040', '\144', '\141', '\040', '\061', + '\012', '\166', '\124', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\143', '\116', '\172', '\040', '\143', '\150', '\040', '\061', + '\012', '\112', '\142', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\143', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\162', '\125', '\167', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\130', '\166', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\122', '\146', '\040', '\144', '\145', '\040', '\061', + '\012', '\142', '\112', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\141', '\161', '\101', '\040', '\141', '\156', '\040', '\061', + '\012', '\165', '\117', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\120', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\165', '\104', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\161', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\130', '\162', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\162', '\114', '\040', '\145', '\162', '\040', '\061', + '\012', '\156', '\112', '\153', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\163', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\161', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\145', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\114', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\105', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\160', '\155', '\105', '\040', '\155', '\145', '\040', '\061', + '\012', '\152', '\111', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\172', '\132', '\040', '\163', '\172', '\040', '\061', + '\012', '\121', '\150', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\156', '\116', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\120', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\132', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\151', '\167', '\122', '\040', '\151', '\156', '\040', '\061', + '\012', '\157', '\112', '\166', '\040', '\153', '\157', '\040', '\061', + '\012', '\165', '\146', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\113', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\165', '\127', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\103', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\167', '\102', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\125', '\171', '\146', '\040', '\156', '\171', '\040', '\061', + '\012', '\165', '\126', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\113', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\155', '\162', '\132', '\040', '\145', '\162', '\040', '\061', + '\012', '\154', '\130', '\142', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\112', '\155', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\131', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\110', '\153', '\167', '\040', '\153', '\141', '\040', '\061', + '\012', '\105', '\167', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\112', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\105', '\155', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\143', '\161', '\114', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\126', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\120', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\172', '\143', '\103', '\040', '\143', '\150', '\040', '\061', + '\012', '\116', '\144', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\127', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\143', '\115', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\153', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\150', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\141', '\120', '\040', '\141', '\156', '\040', '\061', + '\012', '\162', '\126', '\163', '\040', '\145', '\162', '\040', '\061', + '\012', '\144', '\114', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\123', '\147', '\155', '\040', '\156', '\147', '\040', '\061', + '\012', '\130', '\150', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\161', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\113', '\161', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\122', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\127', '\144', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\143', '\121', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\142', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\164', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\167', '\102', '\040', '\143', '\150', '\040', '\061', + '\012', '\156', '\146', '\126', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\147', '\120', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\167', '\127', '\040', '\160', '\162', '\040', '\061', + '\012', '\160', '\161', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\153', '\160', '\040', '\153', '\141', '\040', '\061', + '\012', '\151', '\172', '\112', '\040', '\151', '\156', '\040', '\061', + '\012', '\143', '\131', '\167', '\040', '\143', '\150', '\040', '\061', + '\012', '\151', '\121', '\154', '\040', '\151', '\156', '\040', '\061', + '\012', '\121', '\166', '\171', '\040', '\166', '\141', '\040', '\061', + '\012', '\171', '\154', '\122', '\040', '\154', '\145', '\040', '\061', + '\012', '\163', '\106', '\160', '\040', '\163', '\164', '\040', '\061', + '\012', '\114', '\161', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\156', '\120', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\131', '\154', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\111', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\161', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\160', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\130', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\162', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\163', '\152', '\111', '\040', '\163', '\164', '\040', '\061', + '\012', '\151', '\171', '\130', '\040', '\151', '\156', '\040', '\061', + '\012', '\132', '\146', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\164', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\132', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\130', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\112', '\167', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\142', '\120', '\040', '\156', '\147', '\040', '\061', + '\012', '\121', '\165', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\122', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\130', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\126', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\107', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\116', '\170', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\171', '\113', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\101', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\157', '\125', '\170', '\040', '\157', '\156', '\040', '\061', + '\012', '\156', '\127', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\167', '\125', '\040', '\167', '\141', '\040', '\061', + '\012', '\155', '\113', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\150', '\117', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\107', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\127', '\167', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\156', '\105', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\152', '\123', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\171', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\127', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\121', '\144', '\152', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\123', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\111', '\157', '\171', '\040', '\157', '\156', '\040', '\061', + '\012', '\130', '\160', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\170', '\112', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\170', '\166', '\124', '\040', '\166', '\141', '\040', '\061', + '\012', '\143', '\144', '\124', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\150', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\126', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\152', '\124', '\040', '\143', '\150', '\040', '\061', + '\012', '\110', '\161', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\142', '\120', '\040', '\141', '\156', '\040', '\061', + '\012', '\125', '\167', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\113', '\143', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\163', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\153', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\162', '\130', '\040', '\145', '\162', '\040', '\061', + '\012', '\172', '\142', '\116', '\040', '\163', '\172', '\040', '\061', + '\012', '\155', '\131', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\147', '\114', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\107', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\120', '\142', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\143', '\126', '\040', '\143', '\150', '\040', '\061', + '\012', '\121', '\152', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\166', '\102', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\113', '\160', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\132', '\171', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\150', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\103', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\114', '\162', '\153', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\122', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\143', '\115', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\157', '\150', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\162', '\113', '\040', '\145', '\162', '\040', '\061', + '\012', '\144', '\121', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\110', '\144', '\152', '\040', '\144', '\145', '\040', '\061', + '\012', '\102', '\153', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\171', '\130', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\144', '\117', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\127', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\130', '\164', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\125', '\170', '\040', '\141', '\162', '\040', '\061', + '\012', '\161', '\110', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\121', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\172', '\125', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\124', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\153', '\116', '\040', '\163', '\172', '\040', '\061', + '\012', '\106', '\161', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\112', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\153', '\121', '\040', '\153', '\141', '\040', '\061', + '\012', '\167', '\170', '\106', '\040', '\167', '\141', '\040', '\061', + '\012', '\166', '\122', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\172', '\104', '\040', '\163', '\172', '\040', '\061', + '\012', '\132', '\161', '\165', '\040', '\165', '\156', '\040', '\061', + '\012', '\172', '\127', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\147', '\125', '\040', '\156', '\147', '\040', '\061', + '\012', '\165', '\147', '\130', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\155', '\102', '\040', '\155', '\145', '\040', '\061', + '\012', '\147', '\172', '\101', '\040', '\156', '\147', '\040', '\061', + '\012', '\132', '\152', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\111', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\157', '\113', '\040', '\157', '\156', '\040', '\061', + '\012', '\107', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\114', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\107', '\167', '\040', '\154', '\145', '\040', '\061', + '\012', '\164', '\132', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\143', '\116', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\120', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\162', '\161', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\167', '\107', '\040', '\160', '\162', '\040', '\061', + '\012', '\166', '\146', '\120', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\111', '\171', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\105', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\161', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\110', '\170', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\114', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\160', '\171', '\040', '\160', '\162', '\040', '\061', + '\012', '\160', '\122', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\146', '\132', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\126', '\166', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\153', '\102', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\107', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\153', '\166', '\132', '\040', '\153', '\141', '\040', '\061', + '\012', '\143', '\161', '\127', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\114', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\131', '\160', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\162', '\122', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\167', '\132', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\126', '\144', '\040', '\156', '\147', '\040', '\061', + '\012', '\151', '\103', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\106', '\170', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\171', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\147', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\114', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\160', '\130', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\116', '\166', '\040', '\156', '\147', '\040', '\061', + '\012', '\110', '\147', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\112', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\110', '\166', '\155', '\040', '\166', '\141', '\040', '\061', + '\012', '\165', '\130', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\114', '\172', '\040', '\154', '\145', '\040', '\061', + '\012', '\144', '\167', '\120', '\040', '\144', '\145', '\040', '\061', + '\012', '\147', '\166', '\116', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\160', '\106', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\132', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\120', '\146', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\143', '\111', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\126', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\146', '\144', '\103', '\040', '\144', '\145', '\040', '\061', + '\012', '\160', '\142', '\105', '\040', '\160', '\162', '\040', '\061', + '\012', '\152', '\121', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\124', '\161', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\115', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\107', '\153', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\144', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\111', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\150', '\110', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\114', '\163', '\142', '\040', '\163', '\164', '\040', '\061', + '\012', '\127', '\166', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\121', '\143', '\167', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\146', '\121', '\040', '\156', '\147', '\040', '\061', + '\012', '\106', '\152', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\102', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\114', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\172', '\153', '\122', '\040', '\163', '\172', '\040', '\061', + '\012', '\153', '\152', '\101', '\040', '\151', '\152', '\040', '\061', + '\012', '\106', '\143', '\167', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\150', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\151', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\121', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\130', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\114', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\112', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\163', '\117', '\152', '\040', '\163', '\164', '\040', '\061', + '\012', '\166', '\127', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\101', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\113', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\151', '\111', '\171', '\040', '\151', '\156', '\040', '\061', + '\012', '\160', '\112', '\171', '\040', '\160', '\162', '\040', '\061', + '\012', '\114', '\161', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\102', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\153', '\122', '\142', '\040', '\153', '\141', '\040', '\061', + '\012', '\114', '\143', '\160', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\146', '\102', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\126', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\127', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\171', '\146', '\040', '\156', '\171', '\040', '\061', + '\012', '\160', '\165', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\111', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\107', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\152', '\152', '\114', '\040', '\151', '\152', '\040', '\061', + '\012', '\150', '\143', '\105', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\150', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\170', '\116', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\115', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\122', '\172', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\147', '\117', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\155', '\124', '\040', '\166', '\141', '\040', '\061', + '\012', '\104', '\143', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\157', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\116', '\161', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\150', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\102', '\161', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\127', '\166', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\155', '\105', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\143', '\144', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\131', '\152', '\040', '\154', '\145', '\040', '\061', + '\012', '\144', '\104', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\125', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\126', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\161', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\165', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\172', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\166', '\130', '\040', '\166', '\141', '\040', '\061', + '\012', '\120', '\171', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\165', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\114', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\161', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\126', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\147', '\163', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\152', '\106', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\153', '\107', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\112', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\172', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\111', '\170', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\115', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\146', '\121', '\040', '\144', '\145', '\040', '\061', + '\012', '\145', '\117', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\155', '\110', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\153', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\156', '\161', '\127', '\040', '\141', '\156', '\040', '\061', + '\012', '\156', '\112', '\144', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\105', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\126', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\132', '\171', '\146', '\040', '\156', '\171', '\040', '\061', + '\012', '\156', '\155', '\124', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\163', '\121', '\040', '\143', '\150', '\040', '\061', + '\012', '\120', '\153', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\144', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\153', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\121', '\156', '\143', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\102', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\115', '\152', '\166', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\155', '\112', '\040', '\155', '\145', '\040', '\061', + '\012', '\115', '\170', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\150', '\142', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\121', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\104', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\144', '\152', '\103', '\040', '\144', '\145', '\040', '\061', + '\012', '\143', '\144', '\121', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\156', '\114', '\040', '\141', '\156', '\040', '\061', + '\012', '\131', '\152', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\125', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\152', '\127', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\127', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\170', '\166', '\106', '\040', '\166', '\141', '\040', '\061', + '\012', '\107', '\161', '\151', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\107', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\130', '\165', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\103', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\113', '\170', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\154', '\116', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\144', '\114', '\040', '\144', '\145', '\040', '\061', + '\012', '\126', '\164', '\156', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\112', '\152', '\040', '\163', '\164', '\040', '\061', + '\012', '\153', '\121', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\146', '\130', '\040', '\146', '\157', '\040', '\061', + '\012', '\116', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\102', '\163', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\172', '\120', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\125', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\154', '\142', '\124', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\171', '\126', '\040', '\167', '\141', '\040', '\061', + '\012', '\130', '\153', '\155', '\040', '\153', '\141', '\040', '\061', + '\012', '\127', '\144', '\166', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\121', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\161', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\146', '\127', '\040', '\163', '\164', '\040', '\061', + '\012', '\147', '\146', '\115', '\040', '\156', '\147', '\040', '\061', + '\012', '\126', '\154', '\160', '\040', '\154', '\145', '\040', '\061', + '\012', '\130', '\152', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\150', '\111', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\167', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\170', '\132', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\151', '\113', '\167', '\040', '\151', '\156', '\040', '\061', + '\012', '\124', '\142', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\121', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\156', '\155', '\132', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\160', '\105', '\040', '\160', '\162', '\040', '\061', + '\012', '\172', '\123', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\106', '\147', '\151', '\040', '\156', '\147', '\040', '\061', + '\012', '\165', '\111', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\166', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\162', '\161', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\152', '\132', '\040', '\151', '\152', '\040', '\061', + '\012', '\116', '\152', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\153', '\167', '\106', '\040', '\153', '\141', '\040', '\061', + '\012', '\117', '\166', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\167', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\115', '\166', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\104', '\166', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\163', '\120', '\040', '\163', '\164', '\040', '\061', + '\012', '\147', '\132', '\161', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\130', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\107', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\154', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\116', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\116', '\166', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\144', '\132', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\170', '\126', '\040', '\166', '\141', '\040', '\061', + '\012', '\116', '\150', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\132', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\171', '\123', '\040', '\151', '\156', '\040', '\061', + '\012', '\161', '\132', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\162', '\132', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\154', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\152', '\115', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\131', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\151', '\171', '\106', '\040', '\151', '\156', '\040', '\061', + '\012', '\103', '\144', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\167', '\105', '\040', '\167', '\141', '\040', '\061', + '\012', '\170', '\146', '\126', '\040', '\146', '\157', '\040', '\061', + '\012', '\167', '\142', '\106', '\040', '\167', '\141', '\040', '\061', + '\012', '\167', '\165', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\154', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\103', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\143', '\132', '\040', '\143', '\150', '\040', '\061', + '\012', '\107', '\152', '\166', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\114', '\154', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\114', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\155', '\120', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\131', '\157', '\040', '\143', '\150', '\040', '\061', + '\012', '\122', '\150', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\162', '\115', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\104', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\131', '\171', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\165', '\171', '\127', '\040', '\165', '\156', '\040', '\061', + '\012', '\153', '\107', '\142', '\040', '\153', '\141', '\040', '\061', + '\012', '\151', '\167', '\113', '\040', '\151', '\156', '\040', '\061', + '\012', '\161', '\153', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\130', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\103', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\162', '\121', '\146', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\162', '\117', '\040', '\145', '\162', '\040', '\061', + '\012', '\106', '\172', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\123', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\120', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\102', '\161', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\127', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\150', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\102', '\167', '\040', '\153', '\141', '\040', '\061', + '\012', '\171', '\166', '\114', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\143', '\124', '\040', '\143', '\150', '\040', '\061', + '\012', '\106', '\142', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\105', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\105', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\165', '\121', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\110', '\167', '\040', '\165', '\163', '\040', '\061', + '\012', '\106', '\166', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\153', '\117', '\040', '\153', '\141', '\040', '\061', + '\012', '\167', '\151', '\131', '\040', '\151', '\156', '\040', '\061', + '\012', '\163', '\120', '\155', '\040', '\163', '\164', '\040', '\061', + '\012', '\144', '\106', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\121', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\163', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\125', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\164', '\114', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\122', '\153', '\040', '\163', '\164', '\040', '\061', + '\012', '\172', '\153', '\120', '\040', '\163', '\172', '\040', '\061', + '\012', '\155', '\166', '\106', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\131', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\163', '\167', '\131', '\040', '\151', '\163', '\040', '\061', + '\012', '\162', '\122', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\162', '\110', '\144', '\040', '\145', '\162', '\040', '\061', + '\012', '\142', '\104', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\154', '\127', '\166', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\161', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\157', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\115', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\160', '\146', '\112', '\040', '\160', '\162', '\040', '\061', + '\012', '\104', '\155', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\157', '\142', '\121', '\040', '\157', '\156', '\040', '\061', + '\012', '\126', '\146', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\126', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\103', '\152', '\166', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\113', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\152', '\105', '\040', '\151', '\152', '\040', '\061', + '\012', '\101', '\161', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\103', '\170', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\160', '\110', '\040', '\166', '\141', '\040', '\061', + '\012', '\114', '\170', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\160', '\110', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\157', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\122', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\131', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\144', '\125', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\113', '\170', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\125', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\150', '\104', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\104', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\127', '\163', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\172', '\132', '\040', '\163', '\172', '\040', '\061', + '\012', '\155', '\107', '\146', '\040', '\155', '\145', '\040', '\061', + '\012', '\152', '\152', '\126', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\146', '\122', '\040', '\160', '\162', '\040', '\061', + '\012', '\142', '\120', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\152', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\114', '\167', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\161', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\122', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\163', '\146', '\124', '\040', '\163', '\172', '\040', '\061', + '\012', '\107', '\162', '\167', '\040', '\145', '\162', '\040', '\061', + '\012', '\172', '\107', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\143', '\127', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\125', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\122', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\132', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\123', '\166', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\120', '\150', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\166', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\121', '\154', '\155', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\147', '\123', '\040', '\156', '\147', '\040', '\061', + '\012', '\115', '\155', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\120', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\161', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\127', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\111', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\103', '\170', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\167', '\164', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\113', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\164', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\122', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\172', '\163', '\102', '\040', '\163', '\172', '\040', '\061', + '\012', '\156', '\142', '\104', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\113', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\150', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\131', '\150', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\131', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\152', '\103', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\172', '\113', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\112', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\121', '\162', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\165', '\166', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\146', '\112', '\040', '\143', '\150', '\040', '\061', + '\012', '\151', '\161', '\130', '\040', '\151', '\156', '\040', '\061', + '\012', '\166', '\116', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\143', '\115', '\040', '\143', '\150', '\040', '\061', + '\012', '\127', '\166', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\155', '\123', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\127', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\141', '\111', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\155', '\123', '\040', '\151', '\152', '\040', '\061', + '\012', '\106', '\155', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\151', '\171', '\116', '\040', '\151', '\156', '\040', '\061', + '\012', '\142', '\132', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\113', '\172', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\126', '\167', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\125', '\154', '\170', '\040', '\154', '\145', '\040', '\061', + '\012', '\162', '\103', '\166', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\166', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\153', '\162', '\040', '\162', '\151', '\040', '\061', + '\012', '\146', '\152', '\103', '\040', '\151', '\152', '\040', '\061', + '\012', '\164', '\122', '\162', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\103', '\171', '\040', '\160', '\162', '\040', '\061', + '\012', '\146', '\142', '\103', '\040', '\142', '\145', '\040', '\061', + '\012', '\146', '\121', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\153', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\104', '\161', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\147', '\105', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\115', '\155', '\040', '\166', '\141', '\040', '\061', + '\012', '\144', '\120', '\142', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\152', '\114', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\113', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\120', '\171', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\145', '\130', '\166', '\040', '\145', '\162', '\040', '\061', + '\012', '\156', '\126', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\112', '\167', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\104', '\146', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\103', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\164', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\161', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\102', '\150', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\143', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\113', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\164', '\146', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\142', '\132', '\040', '\151', '\156', '\040', '\061', + '\012', '\116', '\172', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\127', '\156', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\130', '\171', '\040', '\166', '\141', '\040', '\061', + '\012', '\151', '\126', '\146', '\040', '\151', '\156', '\040', '\061', + '\012', '\144', '\170', '\124', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\170', '\121', '\040', '\151', '\152', '\040', '\061', + '\012', '\104', '\144', '\166', '\040', '\144', '\145', '\040', '\061', + '\012', '\155', '\130', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\125', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\147', '\121', '\040', '\156', '\147', '\040', '\061', + '\012', '\114', '\147', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\147', '\131', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\115', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\160', '\112', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\132', '\170', '\040', '\163', '\164', '\040', '\061', + '\012', '\156', '\130', '\172', '\040', '\141', '\156', '\040', '\061', + '\012', '\127', '\166', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\154', '\126', '\153', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\103', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\170', '\166', '\111', '\040', '\166', '\141', '\040', '\061', + '\012', '\155', '\146', '\112', '\040', '\155', '\145', '\040', '\061', + '\012', '\164', '\121', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\124', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\126', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\111', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\166', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\146', '\116', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\121', '\163', '\040', '\156', '\147', '\040', '\061', + '\012', '\151', '\126', '\160', '\040', '\151', '\156', '\040', '\061', + '\012', '\152', '\107', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\115', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\170', '\166', '\167', '\040', '\167', '\151', '\040', '\061', + '\012', '\172', '\111', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\146', '\122', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\127', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\145', '\150', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\132', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\155', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\114', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\132', '\142', '\040', '\160', '\162', '\040', '\061', + '\012', '\166', '\156', '\112', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\166', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\130', '\150', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\152', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\147', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\141', '\112', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\123', '\146', '\040', '\155', '\145', '\040', '\061', + '\012', '\130', '\172', '\155', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\124', '\172', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\130', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\160', '\121', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\103', '\161', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\123', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\160', '\162', '\127', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\104', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\130', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\143', '\104', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\147', '\132', '\040', '\156', '\147', '\040', '\061', + '\012', '\124', '\172', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\143', '\122', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\167', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\130', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\131', '\167', '\166', '\040', '\167', '\151', '\040', '\061', + '\012', '\162', '\160', '\113', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\120', '\163', '\040', '\151', '\163', '\040', '\061', + '\012', '\113', '\152', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\104', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\152', '\162', '\106', '\040', '\145', '\162', '\040', '\061', + '\012', '\142', '\142', '\121', '\040', '\142', '\145', '\040', '\061', + '\012', '\121', '\144', '\142', '\040', '\144', '\145', '\040', '\061', + '\012', '\162', '\113', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\131', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\170', '\101', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\150', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\163', '\125', '\040', '\163', '\164', '\040', '\061', + '\012', '\172', '\130', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\165', '\167', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\163', '\122', '\040', '\163', '\164', '\040', '\061', + '\012', '\153', '\110', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\127', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\146', '\123', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\111', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\142', '\143', '\127', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\144', '\115', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\103', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\172', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\121', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\157', '\152', '\130', '\040', '\157', '\156', '\040', '\061', + '\012', '\126', '\161', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\127', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\153', '\142', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\156', '\112', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\112', '\172', '\040', '\163', '\164', '\040', '\061', + '\012', '\150', '\122', '\162', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\130', '\163', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\145', '\142', '\040', '\145', '\162', '\040', '\061', + '\012', '\125', '\167', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\156', '\131', '\147', '\040', '\141', '\156', '\040', '\061', + '\012', '\131', '\146', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\170', '\162', '\107', '\040', '\145', '\162', '\040', '\061', + '\012', '\145', '\132', '\162', '\040', '\154', '\145', '\040', '\061', + '\012', '\165', '\146', '\126', '\040', '\165', '\163', '\040', '\061', + '\012', '\162', '\130', '\155', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\132', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\121', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\124', '\156', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\122', '\155', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\154', '\115', '\040', '\154', '\145', '\040', '\061', + '\012', '\143', '\161', '\117', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\127', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\152', '\143', '\132', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\146', '\126', '\040', '\151', '\152', '\040', '\061', + '\012', '\132', '\155', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\170', '\115', '\040', '\142', '\145', '\040', '\061', + '\012', '\146', '\106', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\147', '\152', '\120', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\115', '\163', '\040', '\164', '\150', '\040', '\061', + '\012', '\131', '\163', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\153', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\113', '\155', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\131', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\144', '\166', '\130', '\040', '\144', '\145', '\040', '\061', + '\012', '\162', '\167', '\103', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\167', '\127', '\040', '\167', '\141', '\040', '\061', + '\012', '\121', '\160', '\171', '\040', '\160', '\162', '\040', '\061', + '\012', '\152', '\130', '\171', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\117', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\155', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\105', '\161', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\112', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\110', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\150', '\104', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\104', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\153', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\114', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\110', '\155', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\156', '\130', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\170', '\123', '\040', '\151', '\152', '\040', '\061', + '\012', '\112', '\164', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\147', '\105', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\160', '\110', '\040', '\160', '\162', '\040', '\061', + '\012', '\111', '\161', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\115', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\155', '\105', '\040', '\144', '\145', '\040', '\061', + '\012', '\110', '\146', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\123', '\142', '\040', '\160', '\162', '\040', '\061', + '\012', '\170', '\150', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\152', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\146', '\130', '\040', '\156', '\171', '\040', '\061', + '\012', '\166', '\165', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\106', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\172', '\156', '\123', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\154', '\126', '\040', '\154', '\145', '\040', '\061', + '\012', '\154', '\153', '\113', '\040', '\154', '\145', '\040', '\061', + '\012', '\106', '\166', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\152', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\157', '\121', '\040', '\157', '\156', '\040', '\061', + '\012', '\127', '\166', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\115', '\156', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\115', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\147', '\143', '\106', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\142', '\102', '\040', '\144', '\145', '\040', '\061', + '\012', '\103', '\161', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\103', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\112', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\104', '\146', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\163', '\152', '\114', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\151', '\107', '\040', '\151', '\156', '\040', '\061', + '\012', '\132', '\154', '\163', '\040', '\154', '\145', '\040', '\061', + '\012', '\126', '\163', '\146', '\040', '\163', '\164', '\040', '\061', + '\012', '\106', '\147', '\144', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\155', '\104', '\040', '\155', '\145', '\040', '\061', + '\012', '\104', '\170', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\161', '\162', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\112', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\114', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\144', '\102', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\142', '\115', '\040', '\142', '\145', '\040', '\061', + '\012', '\155', '\166', '\115', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\164', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\156', '\102', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\164', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\113', '\163', '\144', '\040', '\163', '\164', '\040', '\061', + '\012', '\167', '\161', '\154', '\040', '\167', '\141', '\040', '\061', + '\012', '\155', '\150', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\157', '\112', '\171', '\040', '\157', '\156', '\040', '\061', + '\012', '\107', '\150', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\157', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\163', '\111', '\040', '\163', '\164', '\040', '\061', + '\012', '\166', '\106', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\131', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\154', '\156', '\126', '\040', '\141', '\156', '\040', '\061', + '\012', '\165', '\130', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\105', '\157', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\143', '\115', '\040', '\167', '\141', '\040', '\061', + '\012', '\152', '\167', '\113', '\040', '\151', '\152', '\040', '\061', + '\012', '\107', '\153', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\165', '\106', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\143', '\147', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\161', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\164', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\110', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\145', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\152', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\156', '\165', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\106', '\143', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\113', '\161', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\114', '\161', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\167', '\125', '\040', '\155', '\145', '\040', '\061', + '\012', '\146', '\121', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\153', '\123', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\156', '\131', '\166', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\107', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\166', '\132', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\161', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\106', '\150', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\115', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\102', '\150', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\130', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\161', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\171', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\113', '\162', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\156', '\166', '\040', '\141', '\156', '\040', '\061', + '\012', '\165', '\165', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\163', '\172', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\113', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\171', '\111', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\116', '\143', '\144', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\114', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\123', '\163', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\142', '\105', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\141', '\127', '\040', '\141', '\156', '\040', '\061', + '\012', '\122', '\164', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\142', '\106', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\147', '\122', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\143', '\132', '\040', '\143', '\150', '\040', '\061', + '\012', '\162', '\110', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\145', '\131', '\167', '\040', '\145', '\162', '\040', '\061', + '\012', '\114', '\170', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\122', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\160', '\116', '\040', '\151', '\152', '\040', '\061', + '\012', '\162', '\152', '\127', '\040', '\145', '\162', '\040', '\061', + '\012', '\154', '\147', '\113', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\103', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\107', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\172', '\124', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\121', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\153', '\154', '\112', '\040', '\154', '\151', '\040', '\061', + '\012', '\143', '\161', '\153', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\115', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\131', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\150', '\121', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\170', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\145', '\131', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\150', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\102', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\146', '\126', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\146', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\142', '\124', '\040', '\163', '\164', '\040', '\061', + '\012', '\144', '\121', '\171', '\040', '\144', '\145', '\040', '\061', + '\012', '\106', '\155', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\150', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\164', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\162', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\171', '\161', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\104', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\146', '\126', '\040', '\155', '\145', '\040', '\061', + '\012', '\157', '\123', '\170', '\040', '\157', '\156', '\040', '\061', + '\012', '\112', '\170', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\117', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\112', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\166', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\105', '\161', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\161', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\170', '\111', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\113', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\144', '\127', '\040', '\144', '\145', '\040', '\061', + '\012', '\143', '\143', '\115', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\143', '\127', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\106', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\122', '\166', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\156', '\116', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\142', '\125', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\116', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\152', '\113', '\040', '\151', '\152', '\040', '\061', + '\012', '\112', '\142', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\102', '\146', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\145', '\130', '\040', '\154', '\145', '\040', '\061', + '\012', '\164', '\130', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\154', '\112', '\040', '\154', '\145', '\040', '\061', + '\012', '\143', '\113', '\144', '\040', '\143', '\150', '\040', '\061', + '\012', '\156', '\103', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\147', '\126', '\040', '\156', '\147', '\040', '\061', + '\012', '\115', '\150', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\113', '\146', '\040', '\163', '\164', '\040', '\061', + '\012', '\150', '\161', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\144', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\172', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\116', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\152', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\143', '\116', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\143', '\112', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\152', '\125', '\040', '\144', '\145', '\040', '\061', + '\012', '\131', '\147', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\157', '\111', '\040', '\157', '\156', '\040', '\061', + '\012', '\131', '\171', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\153', '\121', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\146', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\162', '\114', '\040', '\141', '\156', '\040', '\061', + '\012', '\154', '\121', '\163', '\040', '\154', '\145', '\040', '\061', + '\012', '\155', '\164', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\142', '\130', '\040', '\167', '\141', '\040', '\061', + '\012', '\147', '\155', '\122', '\040', '\156', '\147', '\040', '\061', + '\012', '\132', '\163', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\164', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\142', '\106', '\040', '\155', '\145', '\040', '\061', + '\012', '\146', '\147', '\124', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\127', '\165', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\170', '\107', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\116', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\146', '\127', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\162', '\103', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\157', '\130', '\040', '\157', '\156', '\040', '\061', + '\012', '\167', '\152', '\124', '\040', '\151', '\152', '\040', '\061', + '\012', '\120', '\161', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\153', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\156', '\114', '\172', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\152', '\126', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\143', '\120', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\154', '\121', '\040', '\154', '\145', '\040', '\061', + '\012', '\106', '\147', '\161', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\147', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\107', '\161', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\113', '\163', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\146', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\171', '\132', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\151', '\132', '\040', '\151', '\156', '\040', '\061', + '\012', '\162', '\130', '\166', '\040', '\145', '\162', '\040', '\061', + '\012', '\131', '\143', '\171', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\166', '\101', '\040', '\166', '\141', '\040', '\061', + '\012', '\124', '\161', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\132', '\171', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\167', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\126', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\115', '\150', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\123', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\150', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\172', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\107', '\166', '\155', '\040', '\166', '\141', '\040', '\061', + '\012', '\143', '\161', '\125', '\040', '\143', '\150', '\040', '\061', + '\012', '\110', '\150', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\121', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\167', '\114', '\040', '\160', '\162', '\040', '\061', + '\012', '\163', '\116', '\167', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\105', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\116', '\172', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\163', '\104', '\040', '\163', '\164', '\040', '\061', + '\012', '\155', '\104', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\122', '\164', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\114', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\124', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\170', '\112', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\161', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\161', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\162', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\161', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\111', '\171', '\040', '\155', '\145', '\040', '\061', + '\012', '\111', '\160', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\152', '\103', '\040', '\151', '\152', '\040', '\061', + '\012', '\154', '\114', '\160', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\161', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\127', '\147', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\131', '\143', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\152', '\125', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\130', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\161', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\170', '\124', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\156', '\130', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\102', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\154', '\163', '\040', '\154', '\145', '\040', '\061', + '\012', '\153', '\150', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\161', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\142', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\151', '\104', '\170', '\040', '\154', '\151', '\040', '\061', + '\012', '\132', '\156', '\160', '\040', '\141', '\156', '\040', '\061', + '\012', '\112', '\170', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\161', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\142', '\125', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\122', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\160', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\154', '\107', '\040', '\154', '\145', '\040', '\061', + '\012', '\127', '\147', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\126', '\170', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\123', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\151', '\150', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\172', '\124', '\040', '\163', '\172', '\040', '\061', + '\012', '\141', '\145', '\132', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\113', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\127', '\163', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\114', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\160', '\113', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\112', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\107', '\166', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\105', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\163', '\113', '\144', '\040', '\163', '\164', '\040', '\061', + '\012', '\170', '\150', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\141', '\115', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\145', '\150', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\146', '\132', '\040', '\153', '\165', '\040', '\061', + '\012', '\127', '\167', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\131', '\155', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\126', '\153', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\142', '\172', '\104', '\040', '\163', '\172', '\040', '\061', + '\012', '\130', '\153', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\126', '\172', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\166', '\126', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\110', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\113', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\155', '\115', '\040', '\166', '\141', '\040', '\061', + '\012', '\121', '\170', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\116', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\142', '\161', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\161', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\161', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\166', '\155', '\040', '\166', '\141', '\040', '\061', + '\012', '\154', '\102', '\146', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\161', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\103', '\163', '\040', '\156', '\147', '\040', '\061', + '\012', '\162', '\122', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\122', '\156', '\155', '\040', '\141', '\156', '\040', '\061', + '\012', '\114', '\172', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\151', '\167', '\116', '\040', '\151', '\156', '\040', '\061', + '\012', '\160', '\146', '\116', '\040', '\160', '\162', '\040', '\061', + '\012', '\150', '\103', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\165', '\110', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\114', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\167', '\104', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\152', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\117', '\152', '\171', '\040', '\151', '\152', '\040', '\061', + '\012', '\144', '\155', '\126', '\040', '\144', '\151', '\040', '\061', + '\012', '\143', '\103', '\167', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\130', '\163', '\040', '\154', '\145', '\040', '\061', + '\012', '\163', '\155', '\122', '\040', '\163', '\164', '\040', '\061', + '\012', '\155', '\170', '\117', '\040', '\155', '\145', '\040', '\061', + '\012', '\112', '\162', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\152', '\116', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\102', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\170', '\121', '\040', '\143', '\150', '\040', '\061', + '\012', '\113', '\144', '\160', '\040', '\144', '\145', '\040', '\061', + '\012', '\104', '\154', '\142', '\040', '\154', '\145', '\040', '\061', + '\012', '\160', '\161', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\161', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\123', '\160', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\103', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\146', '\120', '\040', '\156', '\147', '\040', '\061', + '\012', '\165', '\107', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\142', '\105', '\040', '\142', '\145', '\040', '\061', + '\012', '\130', '\160', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\130', '\172', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\161', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\161', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\113', '\166', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\127', '\151', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\170', '\132', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\157', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\123', '\147', '\146', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\122', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\127', '\147', '\151', '\040', '\156', '\147', '\040', '\061', + '\012', '\145', '\104', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\127', '\167', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\106', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\113', '\170', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\151', '\127', '\160', '\040', '\151', '\156', '\040', '\061', + '\012', '\146', '\122', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\167', '\164', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\167', '\127', '\040', '\163', '\164', '\040', '\061', + '\012', '\147', '\162', '\113', '\040', '\156', '\147', '\040', '\061', + '\012', '\110', '\146', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\146', '\132', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\161', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\113', '\152', '\040', '\157', '\156', '\040', '\061', + '\012', '\166', '\146', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\127', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\165', '\127', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\103', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\153', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\104', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\123', '\146', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\165', '\131', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\166', '\122', '\040', '\166', '\141', '\040', '\061', + '\012', '\145', '\101', '\157', '\040', '\145', '\162', '\040', '\061', + '\012', '\160', '\131', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\122', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\151', '\127', '\144', '\040', '\151', '\156', '\040', '\061', + '\012', '\147', '\107', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\130', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\153', '\143', '\120', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\143', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\103', '\146', '\040', '\154', '\145', '\040', '\061', + '\012', '\147', '\155', '\127', '\040', '\156', '\147', '\040', '\061', + '\012', '\110', '\153', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\162', '\150', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\161', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\121', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\103', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\127', '\152', '\040', '\144', '\145', '\040', '\061', + '\012', '\110', '\162', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\163', '\124', '\172', '\040', '\163', '\164', '\040', '\061', + '\012', '\141', '\126', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\167', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\166', '\105', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\113', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\170', '\143', '\131', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\160', '\115', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\154', '\103', '\040', '\154', '\145', '\040', '\061', + '\012', '\144', '\154', '\107', '\040', '\154', '\145', '\040', '\061', + '\012', '\157', '\124', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\151', '\114', '\160', '\040', '\151', '\156', '\040', '\061', + '\012', '\170', '\163', '\114', '\040', '\163', '\164', '\040', '\061', + '\012', '\154', '\106', '\172', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\150', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\154', '\130', '\040', '\154', '\145', '\040', '\061', + '\012', '\160', '\155', '\117', '\040', '\155', '\145', '\040', '\061', + '\012', '\131', '\143', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\131', '\156', '\160', '\040', '\141', '\156', '\040', '\061', + '\012', '\131', '\142', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\121', '\154', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\170', '\101', '\040', '\142', '\145', '\040', '\061', + '\012', '\164', '\106', '\163', '\040', '\164', '\150', '\040', '\061', + '\012', '\114', '\161', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\143', '\125', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\146', '\113', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\160', '\121', '\040', '\166', '\141', '\040', '\061', + '\012', '\104', '\164', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\124', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\126', '\166', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\121', '\142', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\172', '\127', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\123', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\172', '\160', '\113', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\124', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\155', '\153', '\103', '\040', '\153', '\141', '\040', '\061', + '\012', '\143', '\122', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\102', '\153', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\107', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\156', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\141', '\161', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\150', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\167', '\120', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\161', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\143', '\125', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\154', '\123', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\152', '\105', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\161', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\122', '\170', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\126', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\165', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\162', '\102', '\040', '\145', '\162', '\040', '\061', + '\012', '\121', '\171', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\123', '\147', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\131', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\120', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\106', '\144', '\166', '\040', '\144', '\145', '\040', '\061', + '\012', '\130', '\155', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\143', '\120', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\120', '\161', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\131', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\112', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\144', '\121', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\170', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\110', '\167', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\147', '\103', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\152', '\113', '\040', '\151', '\152', '\040', '\061', + '\012', '\156', '\162', '\103', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\161', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\102', '\147', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\103', '\142', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\125', '\167', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\167', '\143', '\112', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\102', '\146', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\124', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\167', '\130', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\127', '\147', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\117', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\142', '\102', '\040', '\142', '\145', '\040', '\061', + '\012', '\170', '\161', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\121', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\157', '\121', '\040', '\157', '\156', '\040', '\061', + '\012', '\171', '\152', '\127', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\166', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\142', '\106', '\040', '\142', '\145', '\040', '\061', + '\012', '\156', '\127', '\165', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\152', '\121', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\152', '\113', '\040', '\143', '\150', '\040', '\061', + '\012', '\123', '\170', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\142', '\130', '\040', '\142', '\145', '\040', '\061', + '\012', '\145', '\131', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\102', '\155', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\104', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\130', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\156', '\115', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\123', '\170', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\154', '\110', '\155', '\040', '\154', '\145', '\040', '\061', + '\012', '\147', '\146', '\131', '\040', '\156', '\147', '\040', '\061', + '\012', '\156', '\167', '\107', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\110', '\154', '\040', '\156', '\147', '\040', '\061', + '\012', '\127', '\160', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\167', '\106', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\150', '\107', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\167', '\103', '\040', '\167', '\141', '\040', '\061', + '\012', '\115', '\154', '\146', '\040', '\154', '\145', '\040', '\061', + '\012', '\143', '\112', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\156', '\103', '\040', '\141', '\156', '\040', '\061', + '\012', '\106', '\166', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\164', '\107', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\150', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\153', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\167', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\142', '\113', '\040', '\142', '\145', '\040', '\061', + '\012', '\172', '\126', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\124', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\162', '\104', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\122', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\106', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\150', '\127', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\172', '\105', '\040', '\154', '\145', '\040', '\061', + '\012', '\154', '\167', '\130', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\110', '\171', '\040', '\151', '\152', '\040', '\061', + '\012', '\121', '\161', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\104', '\161', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\124', '\166', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\120', '\142', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\120', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\144', '\124', '\040', '\163', '\172', '\040', '\061', + '\012', '\155', '\166', '\101', '\040', '\166', '\141', '\040', '\061', + '\012', '\132', '\166', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\141', '\125', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\167', '\121', '\040', '\167', '\141', '\040', '\061', + '\012', '\122', '\163', '\167', '\040', '\163', '\164', '\040', '\061', + '\012', '\153', '\154', '\102', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\154', '\116', '\040', '\154', '\145', '\040', '\061', + '\012', '\107', '\166', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\144', '\112', '\040', '\144', '\145', '\040', '\061', + '\012', '\154', '\143', '\102', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\124', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\150', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\114', '\166', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\172', '\122', '\040', '\163', '\172', '\040', '\061', + '\012', '\130', '\171', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\130', '\154', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\161', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\172', '\150', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\147', '\124', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\160', '\107', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\153', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\161', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\143', '\147', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\146', '\102', '\040', '\142', '\145', '\040', '\061', + '\012', '\127', '\160', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\127', '\170', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\130', '\142', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\106', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\122', '\146', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\150', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\170', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\113', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\164', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\130', '\145', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\130', '\155', '\040', '\163', '\172', '\040', '\061', + '\012', '\107', '\150', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\172', '\131', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\130', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\170', '\127', '\040', '\153', '\141', '\040', '\061', + '\012', '\166', '\126', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\112', '\170', '\165', '\040', '\165', '\156', '\040', '\061', + '\012', '\142', '\142', '\130', '\040', '\142', '\145', '\040', '\061', + '\012', '\162', '\120', '\142', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\103', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\151', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\147', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\116', '\150', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\107', '\160', '\040', '\160', '\157', '\040', '\061', + '\012', '\150', '\120', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\124', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\111', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\112', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\143', '\105', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\103', '\142', '\040', '\155', '\145', '\040', '\061', + '\012', '\142', '\112', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\156', '\172', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\161', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\110', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\142', '\167', '\110', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\103', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\125', '\161', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\170', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\160', '\117', '\040', '\160', '\162', '\040', '\061', + '\012', '\153', '\143', '\116', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\153', '\126', '\040', '\153', '\141', '\040', '\061', + '\012', '\155', '\121', '\142', '\040', '\155', '\145', '\040', '\061', + '\012', '\131', '\161', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\126', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\166', '\142', '\130', '\040', '\166', '\141', '\040', '\061', + '\012', '\155', '\124', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\130', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\167', '\161', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\113', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\153', '\123', '\040', '\153', '\141', '\040', '\061', + '\012', '\127', '\166', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\111', '\171', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\107', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\172', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\142', '\150', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\166', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\130', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\156', '\130', '\143', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\112', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\116', '\161', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\131', '\152', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\106', '\150', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\171', '\113', '\040', '\151', '\152', '\040', '\061', + '\012', '\112', '\172', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\161', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\155', '\132', '\040', '\155', '\145', '\040', '\061', + '\012', '\172', '\142', '\106', '\040', '\163', '\172', '\040', '\061', + '\012', '\163', '\160', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\120', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\123', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\115', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\130', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\171', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\106', '\167', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\155', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\116', '\154', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\161', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\107', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\155', '\130', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\131', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\155', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\104', '\161', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\127', '\153', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\144', '\160', '\124', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\171', '\112', '\040', '\151', '\152', '\040', '\061', + '\012', '\112', '\161', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\152', '\132', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\116', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\101', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\102', '\156', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\160', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\147', '\127', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\130', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\162', '\115', '\154', '\040', '\145', '\162', '\040', '\061', + '\012', '\172', '\147', '\126', '\040', '\156', '\147', '\040', '\061', + '\012', '\156', '\114', '\160', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\106', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\164', '\166', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\121', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\146', '\144', '\106', '\040', '\144', '\145', '\040', '\061', + '\012', '\142', '\170', '\113', '\040', '\142', '\145', '\040', '\061', + '\012', '\102', '\143', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\162', '\160', '\131', '\040', '\145', '\162', '\040', '\061', + '\012', '\163', '\112', '\142', '\040', '\163', '\164', '\040', '\061', + '\012', '\113', '\166', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\116', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\110', '\144', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\172', '\106', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\112', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\146', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\121', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\160', '\113', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\150', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\132', '\151', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\150', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\161', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\156', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\112', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\112', '\153', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\122', '\167', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\172', '\166', '\115', '\040', '\166', '\141', '\040', '\061', + '\012', '\142', '\170', '\131', '\040', '\142', '\145', '\040', '\061', + '\012', '\160', '\130', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\125', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\160', '\166', '\105', '\040', '\166', '\141', '\040', '\061', + '\012', '\114', '\160', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\144', '\172', '\126', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\111', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\167', '\132', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\156', '\160', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\127', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\152', '\147', '\121', '\040', '\156', '\147', '\040', '\061', + '\012', '\112', '\161', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\155', '\130', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\146', '\115', '\040', '\151', '\152', '\040', '\061', + '\012', '\154', '\127', '\152', '\040', '\154', '\145', '\040', '\061', + '\012', '\160', '\142', '\116', '\040', '\160', '\162', '\040', '\061', + '\012', '\146', '\166', '\106', '\040', '\166', '\141', '\040', '\061', + '\012', '\163', '\104', '\144', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\144', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\162', '\114', '\040', '\145', '\162', '\040', '\061', + '\012', '\165', '\110', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\167', '\116', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\102', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\172', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\104', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\121', '\143', '\172', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\172', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\105', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\170', '\110', '\040', '\160', '\162', '\040', '\061', + '\012', '\146', '\161', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\161', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\153', '\104', '\040', '\156', '\147', '\040', '\061', + '\012', '\130', '\146', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\130', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\103', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\120', '\172', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\122', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\161', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\166', '\127', '\040', '\166', '\141', '\040', '\061', + '\012', '\122', '\146', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\147', '\161', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\147', '\117', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\125', '\171', '\040', '\167', '\141', '\040', '\061', + '\012', '\112', '\153', '\167', '\040', '\153', '\141', '\040', '\061', + '\012', '\150', '\123', '\163', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\153', '\127', '\040', '\156', '\147', '\040', '\061', + '\012', '\121', '\147', '\171', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\112', '\142', '\040', '\144', '\145', '\040', '\061', + '\012', '\160', '\162', '\106', '\040', '\145', '\162', '\040', '\061', + '\012', '\142', '\165', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\126', '\147', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\164', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\104', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\131', '\147', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\113', '\161', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\125', '\171', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\154', '\112', '\153', '\040', '\154', '\145', '\040', '\061', + '\012', '\163', '\170', '\131', '\040', '\163', '\164', '\040', '\061', + '\012', '\170', '\146', '\131', '\040', '\146', '\157', '\040', '\061', + '\012', '\130', '\153', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\147', '\132', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\171', '\130', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\142', '\106', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\124', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\163', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\154', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\172', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\153', '\161', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\160', '\121', '\040', '\160', '\157', '\040', '\061', + '\012', '\161', '\112', '\165', '\040', '\165', '\156', '\040', '\061', + '\012', '\150', '\131', '\151', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\154', '\115', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\104', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\166', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\116', '\163', '\146', '\040', '\163', '\164', '\040', '\061', + '\012', '\142', '\112', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\116', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\121', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\113', '\161', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\113', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\155', '\110', '\160', '\040', '\155', '\145', '\040', '\061', + '\012', '\125', '\171', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\170', '\131', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\111', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\124', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\146', '\120', '\040', '\167', '\141', '\040', '\061', + '\012', '\146', '\170', '\111', '\040', '\146', '\157', '\040', '\061', + '\012', '\166', '\121', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\166', '\116', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\167', '\116', '\040', '\160', '\162', '\040', '\061', + '\012', '\166', '\141', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\170', '\121', '\040', '\155', '\145', '\040', '\061', + '\012', '\142', '\144', '\126', '\040', '\144', '\145', '\040', '\061', + '\012', '\103', '\147', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\152', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\127', '\161', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\160', '\117', '\040', '\160', '\162', '\040', '\061', + '\012', '\167', '\157', '\121', '\040', '\157', '\156', '\040', '\061', + '\012', '\170', '\131', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\160', '\124', '\040', '\160', '\162', '\040', '\061', + '\012', '\154', '\116', '\160', '\040', '\154', '\145', '\040', '\061', + '\012', '\160', '\166', '\130', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\114', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\113', '\163', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\162', '\127', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\151', '\125', '\171', '\040', '\151', '\156', '\040', '\061', + '\012', '\142', '\146', '\130', '\040', '\142', '\145', '\040', '\061', + '\012', '\170', '\163', '\126', '\040', '\163', '\164', '\040', '\061', + '\012', '\130', '\156', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\155', '\127', '\040', '\144', '\145', '\040', '\061', + '\012', '\157', '\121', '\167', '\040', '\157', '\156', '\040', '\061', + '\012', '\132', '\170', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\117', '\141', '\171', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\152', '\107', '\040', '\151', '\152', '\040', '\061', + '\012', '\132', '\142', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\161', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\170', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\127', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\125', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\170', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\103', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\146', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\166', '\125', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\111', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\104', '\146', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\132', '\155', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\103', '\161', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\121', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\116', '\142', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\112', '\163', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\150', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\172', '\121', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\131', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\102', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\143', '\126', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\107', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\126', '\167', '\040', '\151', '\156', '\040', '\061', + '\012', '\106', '\172', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\152', '\110', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\165', '\131', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\167', '\123', '\040', '\151', '\152', '\040', '\061', + '\012', '\103', '\161', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\112', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\153', '\144', '\112', '\040', '\144', '\145', '\040', '\061', + '\012', '\153', '\144', '\124', '\040', '\144', '\145', '\040', '\061', + '\012', '\156', '\161', '\102', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\127', '\163', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\163', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\114', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\144', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\147', '\126', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\131', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\145', '\132', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\146', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\166', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\141', '\126', '\160', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\115', '\163', '\040', '\156', '\147', '\040', '\061', + '\012', '\120', '\142', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\155', '\121', '\146', '\040', '\155', '\145', '\040', '\061', + '\012', '\171', '\125', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\166', '\107', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\147', '\106', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\166', '\131', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\162', '\101', '\040', '\145', '\162', '\040', '\061', + '\012', '\171', '\162', '\115', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\115', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\125', '\171', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\144', '\114', '\160', '\040', '\144', '\145', '\040', '\061', + '\012', '\107', '\152', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\105', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\130', '\144', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\110', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\157', '\120', '\172', '\040', '\157', '\156', '\040', '\061', + '\012', '\170', '\111', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\103', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\104', '\172', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\152', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\107', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\152', '\125', '\040', '\151', '\152', '\040', '\061', + '\012', '\103', '\152', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\113', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\166', '\117', '\040', '\166', '\141', '\040', '\061', + '\012', '\120', '\172', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\162', '\113', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\150', '\117', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\154', '\102', '\040', '\154', '\145', '\040', '\061', + '\012', '\154', '\104', '\153', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\154', '\117', '\040', '\154', '\145', '\040', '\061', + '\012', '\160', '\147', '\110', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\121', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\163', '\144', '\132', '\040', '\163', '\164', '\040', '\061', + '\012', '\153', '\121', '\155', '\040', '\153', '\141', '\040', '\061', + '\012', '\154', '\122', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\157', '\121', '\171', '\040', '\157', '\156', '\040', '\061', + '\012', '\164', '\167', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\102', '\144', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\121', '\152', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\156', '\120', '\040', '\141', '\156', '\040', '\061', + '\012', '\116', '\156', '\160', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\151', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\103', '\143', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\110', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\114', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\163', '\146', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\113', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\146', '\153', '\105', '\040', '\153', '\141', '\040', '\061', + '\012', '\152', '\154', '\130', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\132', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\126', '\167', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\142', '\101', '\040', '\163', '\172', '\040', '\061', + '\012', '\110', '\150', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\142', '\131', '\040', '\143', '\150', '\040', '\061', + '\012', '\111', '\153', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\107', '\162', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\152', '\160', '\120', '\040', '\151', '\152', '\040', '\061', + '\012', '\121', '\146', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\150', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\155', '\130', '\040', '\155', '\145', '\040', '\061', + '\012', '\141', '\112', '\142', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\146', '\117', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\130', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\130', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\156', '\126', '\040', '\141', '\156', '\040', '\061', + '\012', '\131', '\160', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\172', '\103', '\171', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\150', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\130', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\107', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\170', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\170', '\124', '\040', '\143', '\150', '\040', '\061', + '\012', '\132', '\163', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\165', '\107', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\172', '\115', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\152', '\123', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\146', '\123', '\040', '\144', '\145', '\040', '\061', + '\012', '\147', '\160', '\110', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\147', '\117', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\161', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\146', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\124', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\132', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\105', '\152', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\121', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\131', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\152', '\126', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\127', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\146', '\122', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\165', '\123', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\103', '\170', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\114', '\143', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\172', '\113', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\161', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\112', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\103', '\152', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\166', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\167', '\116', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\155', '\122', '\040', '\155', '\145', '\040', '\061', + '\012', '\142', '\164', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\124', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\153', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\150', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\111', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\163', '\121', '\040', '\163', '\164', '\040', '\061', + '\012', '\147', '\123', '\144', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\104', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\126', '\152', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\155', '\111', '\040', '\155', '\145', '\040', '\061', + '\012', '\166', '\127', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\113', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\120', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\157', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\113', '\147', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\167', '\130', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\147', '\112', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\127', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\121', '\146', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\150', '\153', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\161', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\167', '\127', '\040', '\151', '\152', '\040', '\061', + '\012', '\163', '\121', '\172', '\040', '\163', '\164', '\040', '\061', + '\012', '\167', '\125', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\155', '\113', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\157', '\121', '\146', '\040', '\157', '\156', '\040', '\061', + '\012', '\152', '\126', '\153', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\167', '\124', '\040', '\167', '\141', '\040', '\061', + '\012', '\163', '\124', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\161', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\154', '\160', '\040', '\154', '\145', '\040', '\061', + '\012', '\160', '\115', '\142', '\040', '\160', '\162', '\040', '\061', + '\012', '\170', '\113', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\160', '\130', '\040', '\160', '\162', '\040', '\061', + '\012', '\166', '\121', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\112', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\113', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\153', '\112', '\040', '\153', '\141', '\040', '\061', + '\012', '\152', '\142', '\121', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\132', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\130', '\147', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\172', '\125', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\124', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\160', '\116', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\167', '\104', '\040', '\145', '\162', '\040', '\061', + '\012', '\121', '\144', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\161', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\162', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\167', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\167', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\172', '\106', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\154', '\127', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\172', '\120', '\040', '\163', '\172', '\040', '\061', + '\012', '\127', '\170', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\162', '\104', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\107', '\160', '\040', '\144', '\145', '\040', '\061', + '\012', '\132', '\164', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\125', '\166', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\145', '\107', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\132', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\121', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\106', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\115', '\161', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\156', '\104', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\166', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\111', '\171', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\146', '\104', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\113', '\142', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\131', '\155', '\040', '\166', '\141', '\040', '\061', + '\012', '\127', '\170', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\113', '\167', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\162', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\103', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\170', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\150', '\105', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\144', '\125', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\107', '\152', '\040', '\163', '\164', '\040', '\061', + '\012', '\107', '\167', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\131', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\155', '\125', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\104', '\155', '\040', '\160', '\157', '\040', '\061', + '\012', '\161', '\155', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\124', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\121', '\170', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\126', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\101', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\105', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\113', '\160', '\171', '\040', '\160', '\162', '\040', '\061', + '\012', '\110', '\161', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\103', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\141', '\161', '\132', '\040', '\141', '\156', '\040', '\061', + '\012', '\154', '\125', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\120', '\166', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\104', '\161', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\144', '\115', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\172', '\114', '\040', '\163', '\172', '\040', '\061', + '\012', '\102', '\150', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\107', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\164', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\124', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\125', '\170', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\126', '\166', '\155', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\110', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\132', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\150', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\144', '\132', '\040', '\144', '\145', '\040', '\061', + '\012', '\150', '\132', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\120', '\155', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\146', '\124', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\152', '\111', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\144', '\132', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\153', '\121', '\040', '\151', '\152', '\040', '\061', + '\012', '\123', '\144', '\152', '\040', '\144', '\145', '\040', '\061', + '\012', '\150', '\104', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\145', '\112', '\152', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\152', '\131', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\114', '\155', '\040', '\163', '\172', '\040', '\061', + '\012', '\145', '\106', '\163', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\147', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\132', '\155', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\154', '\166', '\112', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\131', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\116', '\172', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\112', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\171', '\121', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\160', '\146', '\115', '\040', '\160', '\162', '\040', '\061', + '\012', '\144', '\150', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\155', '\113', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\150', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\107', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\166', '\121', '\040', '\166', '\141', '\040', '\061', + '\012', '\103', '\147', '\161', '\040', '\156', '\147', '\040', '\061', + '\012', '\112', '\146', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\153', '\104', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\144', '\123', '\040', '\144', '\145', '\040', '\061', + '\012', '\111', '\166', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\107', '\153', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\111', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\102', '\172', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\147', '\102', '\142', '\040', '\156', '\147', '\040', '\061', + '\012', '\124', '\160', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\171', '\131', '\040', '\166', '\141', '\040', '\061', + '\012', '\125', '\170', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\153', '\167', '\127', '\040', '\153', '\141', '\040', '\061', + '\012', '\147', '\120', '\146', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\161', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\124', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\172', '\111', '\040', '\163', '\172', '\040', '\061', + '\012', '\131', '\160', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\166', '\104', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\103', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\143', '\121', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\132', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\132', '\170', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\167', '\142', '\101', '\040', '\167', '\141', '\040', '\061', + '\012', '\142', '\124', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\162', '\170', '\122', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\161', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\106', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\160', '\116', '\146', '\040', '\160', '\162', '\040', '\061', + '\012', '\153', '\115', '\166', '\040', '\153', '\141', '\040', '\061', + '\012', '\166', '\125', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\117', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\170', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\161', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\111', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\106', '\172', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\163', '\144', '\040', '\163', '\164', '\040', '\061', + '\012', '\157', '\152', '\131', '\040', '\157', '\156', '\040', '\061', + '\012', '\143', '\105', '\157', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\167', '\122', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\152', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\124', '\160', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\172', '\124', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\146', '\117', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\123', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\116', '\143', '\153', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\167', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\107', '\155', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\111', '\151', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\167', '\105', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\121', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\126', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\131', '\167', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\106', '\170', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\166', '\102', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\131', '\145', '\040', '\154', '\145', '\040', '\061', + '\012', '\147', '\167', '\124', '\040', '\156', '\147', '\040', '\061', + '\012', '\127', '\152', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\110', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\115', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\112', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\126', '\153', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\106', '\170', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\154', '\110', '\166', '\040', '\154', '\145', '\040', '\061', + '\012', '\127', '\160', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\101', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\170', '\102', '\040', '\160', '\162', '\040', '\061', + '\012', '\170', '\165', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\111', '\142', '\040', '\160', '\162', '\040', '\061', + '\012', '\142', '\146', '\105', '\040', '\142', '\145', '\040', '\061', + '\012', '\147', '\122', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\102', '\160', '\142', '\040', '\160', '\162', '\040', '\061', + '\012', '\142', '\170', '\116', '\040', '\142', '\145', '\040', '\061', + '\012', '\153', '\147', '\125', '\040', '\156', '\147', '\040', '\061', + '\012', '\120', '\170', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\103', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\116', '\160', '\142', '\040', '\160', '\162', '\040', '\061', + '\012', '\154', '\170', '\105', '\040', '\154', '\145', '\040', '\061', + '\012', '\154', '\103', '\171', '\040', '\154', '\145', '\040', '\061', + '\012', '\144', '\147', '\130', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\114', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\142', '\121', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\147', '\106', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\170', '\132', '\040', '\160', '\162', '\040', '\061', + '\012', '\160', '\120', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\151', '\131', '\172', '\040', '\151', '\156', '\040', '\061', + '\012', '\166', '\112', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\153', '\124', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\126', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\167', '\123', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\124', '\144', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\121', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\105', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\160', '\120', '\040', '\160', '\162', '\040', '\061', + '\012', '\161', '\152', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\117', '\171', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\155', '\143', '\117', '\040', '\143', '\150', '\040', '\061', + '\012', '\126', '\152', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\144', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\114', '\146', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\166', '\132', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\156', '\117', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\152', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\113', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\147', '\125', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\147', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\115', '\166', '\040', '\144', '\145', '\040', '\061', + '\012', '\130', '\143', '\160', '\040', '\143', '\150', '\040', '\061', + '\012', '\106', '\167', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\167', '\101', '\040', '\160', '\162', '\040', '\061', + '\012', '\114', '\160', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\153', '\120', '\040', '\153', '\141', '\040', '\061', + '\012', '\166', '\110', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\112', '\152', '\171', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\103', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\166', '\115', '\040', '\166', '\141', '\040', '\061', + '\012', '\111', '\143', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\146', '\112', '\040', '\153', '\141', '\040', '\061', + '\012', '\150', '\163', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\127', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\125', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\114', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\152', '\116', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\147', '\121', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\114', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\161', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\155', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\132', '\152', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\132', '\153', '\160', '\040', '\153', '\141', '\040', '\061', + '\012', '\151', '\171', '\110', '\040', '\151', '\156', '\040', '\061', + '\012', '\167', '\165', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\172', '\124', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\167', '\113', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\103', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\171', '\144', '\107', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\144', '\125', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\124', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\154', '\110', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\171', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\154', '\126', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\171', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\127', '\156', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\115', '\172', '\040', '\145', '\162', '\040', '\061', + '\012', '\160', '\130', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\130', '\142', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\153', '\110', '\155', '\040', '\153', '\141', '\040', '\061', + '\012', '\143', '\126', '\144', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\172', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\144', '\116', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\115', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\152', '\123', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\155', '\103', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\111', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\146', '\160', '\115', '\040', '\160', '\162', '\040', '\061', + '\012', '\154', '\143', '\132', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\110', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\112', '\152', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\154', '\107', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\143', '\113', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\121', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\166', '\111', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\167', '\102', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\167', '\143', '\111', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\112', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\121', '\142', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\102', '\152', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\144', '\160', '\131', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\143', '\106', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\123', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\151', '\130', '\152', '\040', '\151', '\156', '\040', '\061', + '\012', '\121', '\147', '\142', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\104', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\170', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\143', '\121', '\040', '\143', '\150', '\040', '\061', + '\012', '\123', '\161', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\155', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\143', '\125', '\040', '\143', '\150', '\040', '\061', + '\012', '\102', '\166', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\172', '\105', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\164', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\142', '\114', '\040', '\166', '\141', '\040', '\061', + '\012', '\142', '\103', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\160', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\155', '\130', '\163', '\040', '\155', '\145', '\040', '\061', + '\012', '\132', '\161', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\153', '\171', '\040', '\153', '\141', '\040', '\061', + '\012', '\130', '\155', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\114', '\156', '\172', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\131', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\122', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\147', '\155', '\113', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\167', '\120', '\040', '\166', '\141', '\040', '\061', + '\012', '\145', '\106', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\116', '\152', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\153', '\154', '\107', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\142', '\105', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\127', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\160', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\132', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\122', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\130', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\151', '\171', '\104', '\040', '\151', '\156', '\040', '\061', + '\012', '\146', '\166', '\114', '\040', '\166', '\141', '\040', '\061', + '\012', '\162', '\120', '\167', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\144', '\122', '\040', '\144', '\145', '\040', '\061', + '\012', '\151', '\123', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\142', '\121', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\170', '\121', '\040', '\170', '\145', '\040', '\061', + '\012', '\104', '\152', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\147', '\113', '\040', '\156', '\147', '\040', '\061', + '\012', '\122', '\150', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\147', '\107', '\040', '\156', '\147', '\040', '\061', + '\012', '\131', '\153', '\171', '\040', '\153', '\141', '\040', '\061', + '\012', '\103', '\170', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\127', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\154', '\155', '\131', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\162', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\167', '\113', '\040', '\167', '\141', '\040', '\061', + '\012', '\170', '\161', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\124', '\167', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\130', '\147', '\161', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\167', '\132', '\040', '\144', '\145', '\040', '\061', + '\012', '\156', '\121', '\154', '\040', '\141', '\156', '\040', '\061', + '\012', '\107', '\150', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\156', '\110', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\155', '\125', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\161', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\152', '\102', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\172', '\123', '\040', '\156', '\147', '\040', '\061', + '\012', '\122', '\167', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\131', '\162', '\040', '\156', '\147', '\040', '\061', + '\012', '\106', '\147', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\144', '\113', '\040', '\144', '\145', '\040', '\061', + '\012', '\150', '\170', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\125', '\170', '\040', '\170', '\145', '\040', '\061', + '\012', '\167', '\155', '\124', '\040', '\155', '\145', '\040', '\061', + '\012', '\171', '\131', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\143', '\104', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\126', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\123', '\147', '\166', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\120', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\131', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\142', '\172', '\105', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\150', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\116', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\164', '\123', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\150', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\114', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\114', '\146', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\147', '\126', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\153', '\123', '\040', '\156', '\147', '\040', '\061', + '\012', '\112', '\161', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\127', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\147', '\117', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\147', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\120', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\127', '\170', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\147', '\161', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\103', '\146', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\167', '\157', '\125', '\040', '\157', '\156', '\040', '\061', + '\012', '\171', '\143', '\112', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\167', '\104', '\040', '\153', '\141', '\040', '\061', + '\012', '\123', '\142', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\161', '\143', '\167', '\040', '\143', '\150', '\040', '\061', + '\012', '\110', '\167', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\142', '\155', '\114', '\040', '\155', '\145', '\040', '\061', + '\012', '\147', '\167', '\132', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\113', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\130', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\151', '\113', '\170', '\040', '\151', '\156', '\040', '\061', + '\012', '\154', '\122', '\172', '\040', '\154', '\145', '\040', '\061', + '\012', '\143', '\110', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\106', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\112', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\155', '\111', '\040', '\155', '\145', '\040', '\061', + '\012', '\143', '\103', '\144', '\040', '\143', '\150', '\040', '\061', + '\012', '\151', '\131', '\144', '\040', '\151', '\156', '\040', '\061', + '\012', '\171', '\146', '\131', '\040', '\156', '\171', '\040', '\061', + '\012', '\170', '\142', '\131', '\040', '\142', '\145', '\040', '\061', + '\012', '\142', '\155', '\105', '\040', '\155', '\145', '\040', '\061', + '\012', '\146', '\102', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\144', '\110', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\143', '\122', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\166', '\114', '\040', '\166', '\141', '\040', '\061', + '\012', '\162', '\152', '\114', '\040', '\145', '\162', '\040', '\061', + '\012', '\163', '\131', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\127', '\160', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\170', '\102', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\102', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\144', '\112', '\040', '\156', '\147', '\040', '\061', + '\012', '\131', '\152', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\146', '\160', '\121', '\040', '\160', '\162', '\040', '\061', + '\012', '\161', '\117', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\152', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\143', '\124', '\040', '\143', '\150', '\040', '\061', + '\012', '\114', '\146', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\106', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\115', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\123', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\167', '\121', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\104', '\171', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\162', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\131', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\126', '\156', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\110', '\143', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\144', '\125', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\166', '\120', '\040', '\166', '\141', '\040', '\061', + '\012', '\131', '\146', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\121', '\153', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\110', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\126', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\153', '\126', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\160', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\106', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\127', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\160', '\131', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\116', '\166', '\040', '\144', '\145', '\040', '\061', + '\012', '\127', '\167', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\106', '\155', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\155', '\104', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\115', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\132', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\152', '\116', '\160', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\150', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\142', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\154', '\113', '\170', '\040', '\154', '\145', '\040', '\061', + '\012', '\151', '\132', '\170', '\040', '\151', '\156', '\040', '\061', + '\012', '\163', '\152', '\124', '\040', '\163', '\172', '\040', '\061', + '\012', '\151', '\152', '\131', '\040', '\151', '\156', '\040', '\061', + '\012', '\161', '\164', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\124', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\110', '\160', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\151', '\107', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\161', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\147', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\106', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\117', '\161', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\130', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\132', '\142', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\113', '\155', '\040', '\154', '\145', '\040', '\061', + '\012', '\123', '\166', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\113', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\126', '\155', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\155', '\111', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\147', '\113', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\124', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\146', '\103', '\040', '\146', '\157', '\040', '\061', + '\012', '\150', '\113', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\123', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\157', '\113', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\156', '\121', '\163', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\151', '\107', '\040', '\151', '\156', '\040', '\061', + '\012', '\161', '\147', '\115', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\121', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\103', '\152', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\120', '\171', '\040', '\151', '\152', '\040', '\061', + '\012', '\130', '\161', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\120', '\172', '\171', '\040', '\163', '\172', '\040', '\061', + '\012', '\106', '\164', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\143', '\105', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\153', '\114', '\040', '\153', '\141', '\040', '\061', + '\012', '\110', '\172', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\124', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\130', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\155', '\115', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\126', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\124', '\161', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\127', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\170', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\121', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\166', '\114', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\120', '\147', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\110', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\170', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\112', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\115', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\111', '\170', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\103', '\171', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\160', '\130', '\146', '\040', '\160', '\162', '\040', '\061', + '\012', '\160', '\114', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\124', '\167', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\104', '\164', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\122', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\165', '\130', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\150', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\111', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\143', '\152', '\114', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\170', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\104', '\155', '\040', '\154', '\145', '\040', '\061', + '\012', '\164', '\130', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\152', '\103', '\040', '\156', '\147', '\040', '\061', + '\012', '\132', '\172', '\144', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\147', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\156', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\113', '\152', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\126', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\142', '\111', '\040', '\142', '\145', '\040', '\061', + '\012', '\132', '\160', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\146', '\117', '\040', '\142', '\145', '\040', '\061', + '\012', '\155', '\123', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\141', '\106', '\040', '\141', '\156', '\040', '\061', + '\012', '\141', '\121', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\152', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\130', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\161', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\166', '\122', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\123', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\144', '\126', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\124', '\146', '\040', '\160', '\162', '\040', '\061', + '\012', '\113', '\172', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\164', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\145', '\147', '\131', '\040', '\156', '\147', '\040', '\061', + '\012', '\122', '\170', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\150', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\107', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\104', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\157', '\131', '\040', '\157', '\156', '\040', '\061', + '\012', '\144', '\113', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\112', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\167', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\111', '\170', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\162', '\115', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\130', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\121', '\171', '\040', '\163', '\172', '\040', '\061', + '\012', '\116', '\160', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\121', '\146', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\162', '\114', '\155', '\040', '\145', '\162', '\040', '\061', + '\012', '\172', '\107', '\155', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\110', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\143', '\131', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\161', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\104', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\147', '\107', '\040', '\156', '\147', '\040', '\061', + '\012', '\104', '\161', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\155', '\117', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\144', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\116', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\162', '\130', '\152', '\040', '\145', '\162', '\040', '\061', + '\012', '\112', '\167', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\104', '\142', '\040', '\155', '\145', '\040', '\061', + '\012', '\167', '\115', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\131', '\152', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\152', '\131', '\040', '\151', '\152', '\040', '\061', + '\012', '\151', '\112', '\142', '\040', '\151', '\156', '\040', '\061', + '\012', '\143', '\144', '\103', '\040', '\143', '\150', '\040', '\061', + '\012', '\131', '\170', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\142', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\106', '\160', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\172', '\150', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\103', '\163', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\130', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\153', '\104', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\165', '\161', '\124', '\040', '\165', '\156', '\040', '\061', + '\012', '\102', '\170', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\102', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\107', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\130', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\171', '\142', '\106', '\040', '\142', '\145', '\040', '\061', + '\012', '\144', '\164', '\101', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\126', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\103', '\142', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\164', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\113', '\144', '\152', '\040', '\144', '\145', '\040', '\061', + '\012', '\153', '\120', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\132', '\166', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\120', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\157', '\110', '\040', '\157', '\156', '\040', '\061', + '\012', '\130', '\160', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\130', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\124', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\167', '\121', '\040', '\153', '\141', '\040', '\061', + '\012', '\153', '\132', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\125', '\161', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\112', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\103', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\115', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\150', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\142', '\102', '\040', '\153', '\141', '\040', '\061', + '\012', '\107', '\160', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\163', '\107', '\172', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\167', '\105', '\040', '\167', '\141', '\040', '\061', + '\012', '\124', '\164', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\107', '\161', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\172', '\116', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\153', '\117', '\040', '\153', '\141', '\040', '\061', + '\012', '\165', '\172', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\170', '\121', '\040', '\157', '\156', '\040', '\061', + '\012', '\126', '\147', '\155', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\155', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\161', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\122', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\124', '\156', '\162', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\152', '\127', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\167', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\164', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\156', '\114', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\104', '\170', '\040', '\156', '\171', '\040', '\061', + '\012', '\170', '\146', '\121', '\040', '\146', '\157', '\040', '\061', + '\012', '\167', '\170', '\112', '\040', '\167', '\141', '\040', '\061', + '\012', '\156', '\170', '\105', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\121', '\156', '\040', '\151', '\156', '\040', '\061', + '\012', '\127', '\153', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\167', '\104', '\040', '\167', '\141', '\040', '\061', + '\012', '\160', '\106', '\146', '\040', '\160', '\162', '\040', '\061', + '\012', '\154', '\142', '\113', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\110', '\171', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\126', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\117', '\161', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\143', '\116', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\127', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\115', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\156', '\167', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\156', '\115', '\040', '\141', '\156', '\040', '\061', + '\012', '\132', '\164', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\121', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\126', '\170', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\125', '\170', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\127', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\171', '\122', '\170', '\040', '\156', '\171', '\040', '\061', + '\012', '\161', '\113', '\165', '\040', '\165', '\156', '\040', '\061', + '\012', '\152', '\130', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\160', '\130', '\040', '\151', '\152', '\040', '\061', + '\012', '\144', '\153', '\107', '\040', '\144', '\145', '\040', '\061', + '\012', '\102', '\156', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\131', '\153', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\147', '\142', '\127', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\154', '\130', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\153', '\110', '\040', '\153', '\141', '\040', '\061', + '\012', '\144', '\113', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\113', '\160', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\161', '\115', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\102', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\162', '\120', '\152', '\040', '\145', '\162', '\040', '\061', + '\012', '\110', '\172', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\131', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\107', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\111', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\125', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\162', '\124', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\161', '\111', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\146', '\120', '\040', '\151', '\152', '\040', '\061', + '\012', '\150', '\122', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\122', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\152', '\152', '\113', '\040', '\151', '\152', '\040', '\061', + '\012', '\164', '\146', '\105', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\163', '\167', '\040', '\163', '\164', '\040', '\061', + '\012', '\106', '\143', '\155', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\112', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\164', '\130', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\122', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\147', '\161', '\105', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\107', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\113', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\130', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\102', '\171', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\124', '\144', '\040', '\154', '\145', '\040', '\061', + '\012', '\127', '\161', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\106', '\164', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\144', '\102', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\156', '\130', '\040', '\141', '\156', '\040', '\061', + '\012', '\102', '\161', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\161', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\144', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\157', '\152', '\112', '\040', '\157', '\156', '\040', '\061', + '\012', '\161', '\132', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\172', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\154', '\121', '\040', '\154', '\145', '\040', '\061', + '\012', '\132', '\142', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\155', '\166', '\114', '\040', '\166', '\141', '\040', '\061', + '\012', '\114', '\152', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\107', '\161', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\146', '\105', '\040', '\155', '\145', '\040', '\061', + '\012', '\170', '\121', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\114', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\114', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\102', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\125', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\144', '\114', '\040', '\144', '\145', '\040', '\061', + '\012', '\155', '\112', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\144', '\170', '\125', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\161', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\160', '\107', '\040', '\160', '\162', '\040', '\061', + '\012', '\164', '\154', '\117', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\150', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\104', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\122', '\161', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\166', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\152', '\131', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\162', '\121', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\171', '\131', '\040', '\156', '\171', '\040', '\061', + '\012', '\171', '\150', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\131', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\114', '\155', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\112', '\163', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\142', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\141', '\120', '\142', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\167', '\112', '\040', '\144', '\145', '\040', '\061', + '\012', '\130', '\171', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\165', '\143', '\112', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\124', '\146', '\040', '\144', '\145', '\040', '\061', + '\012', '\154', '\102', '\142', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\113', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\143', '\122', '\040', '\143', '\150', '\040', '\061', + '\012', '\145', '\121', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\131', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\126', '\164', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\103', '\143', '\147', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\101', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\170', '\112', '\040', '\156', '\147', '\040', '\061', + '\012', '\165', '\166', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\102', '\150', '\155', '\040', '\155', '\141', '\040', '\061', + '\012', '\132', '\147', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\172', '\112', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\166', '\112', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\124', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\144', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\167', '\107', '\040', '\166', '\141', '\040', '\061', + '\012', '\131', '\155', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\157', '\131', '\167', '\040', '\157', '\156', '\040', '\061', + '\012', '\152', '\130', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\167', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\166', '\126', '\170', '\040', '\166', '\151', '\040', '\061', + '\012', '\122', '\167', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\104', '\166', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\113', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\114', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\171', '\166', '\040', '\166', '\151', '\040', '\061', + '\012', '\103', '\161', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\122', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\121', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\161', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\132', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\161', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\142', '\117', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\126', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\154', '\155', '\040', '\154', '\145', '\040', '\061', + '\012', '\165', '\132', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\120', '\160', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\126', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\126', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\112', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\131', '\172', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\103', '\166', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\167', '\123', '\040', '\160', '\162', '\040', '\061', + '\012', '\113', '\153', '\167', '\040', '\153', '\141', '\040', '\061', + '\012', '\127', '\166', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\106', '\144', '\171', '\040', '\144', '\145', '\040', '\061', + '\012', '\160', '\160', '\130', '\040', '\160', '\162', '\040', '\061', + '\012', '\150', '\166', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\167', '\107', '\040', '\151', '\156', '\040', '\061', + '\012', '\162', '\102', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\102', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\131', '\163', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\143', '\117', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\105', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\142', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\121', '\163', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\166', '\103', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\153', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\151', '\167', '\040', '\151', '\156', '\040', '\061', + '\012', '\107', '\164', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\101', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\126', '\171', '\040', '\167', '\141', '\040', '\061', + '\012', '\142', '\170', '\124', '\040', '\142', '\145', '\040', '\061', + '\012', '\121', '\150', '\163', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\154', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\142', '\101', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\146', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\170', '\127', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\145', '\126', '\040', '\145', '\162', '\040', '\061', + '\012', '\162', '\161', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\161', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\113', '\166', '\040', '\151', '\152', '\040', '\061', + '\012', '\151', '\124', '\146', '\040', '\151', '\156', '\040', '\061', + '\012', '\153', '\167', '\125', '\040', '\153', '\141', '\040', '\061', + '\012', '\151', '\106', '\161', '\040', '\151', '\156', '\040', '\061', + '\012', '\155', '\152', '\132', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\147', '\112', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\114', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\163', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\104', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\144', '\106', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\170', '\116', '\040', '\167', '\141', '\040', '\061', + '\012', '\167', '\107', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\144', '\125', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\112', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\103', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\104', '\150', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\111', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\141', '\121', '\155', '\040', '\141', '\156', '\040', '\061', + '\012', '\131', '\172', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\166', '\110', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\142', '\152', '\126', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\123', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\161', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\162', '\127', '\040', '\145', '\162', '\040', '\061', + '\012', '\110', '\172', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\127', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\115', '\153', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\147', '\106', '\040', '\156', '\147', '\040', '\061', + '\012', '\103', '\156', '\153', '\040', '\141', '\156', '\040', '\061', + '\012', '\162', '\104', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\172', '\102', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\117', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\165', '\126', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\146', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\115', '\150', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\131', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\153', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\131', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\164', '\161', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\160', '\142', '\040', '\160', '\162', '\040', '\061', + '\012', '\142', '\107', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\170', '\106', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\167', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\113', '\147', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\111', '\161', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\112', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\121', '\153', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\126', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\124', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\132', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\104', '\172', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\146', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\141', '\146', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\121', '\167', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\144', '\112', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\124', '\165', '\040', '\165', '\156', '\040', '\061', + '\012', '\125', '\143', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\110', '\156', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\110', '\142', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\171', '\110', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\124', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\170', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\144', '\123', '\040', '\144', '\145', '\040', '\061', + '\012', '\127', '\147', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\157', '\161', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\162', '\146', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\131', '\171', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\115', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\113', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\110', '\171', '\170', '\040', '\156', '\171', '\040', '\061', + '\012', '\115', '\170', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\110', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\146', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\147', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\155', '\117', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\172', '\123', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\167', '\121', '\040', '\151', '\152', '\040', '\061', + '\012', '\106', '\150', '\143', '\040', '\151', '\143', '\040', '\061', + '\012', '\170', '\111', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\146', '\110', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\161', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\106', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\121', '\144', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\150', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\103', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\110', '\147', '\162', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\161', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\147', '\123', '\040', '\156', '\147', '\040', '\061', + '\012', '\116', '\161', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\121', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\121', '\172', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\111', '\170', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\103', '\170', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\155', '\170', '\116', '\040', '\155', '\145', '\040', '\061', + '\012', '\166', '\121', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\143', '\101', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\145', '\103', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\155', '\161', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\161', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\126', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\161', '\157', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\170', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\172', '\130', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\130', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\121', '\164', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\157', '\150', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\131', '\147', '\171', '\040', '\156', '\147', '\040', '\061', + '\012', '\130', '\156', '\142', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\127', '\155', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\130', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\127', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\113', '\155', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\166', '\110', '\040', '\166', '\141', '\040', '\061', + '\012', '\125', '\145', '\167', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\112', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\110', '\153', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\155', '\120', '\040', '\155', '\145', '\040', '\061', + '\012', '\163', '\154', '\122', '\040', '\151', '\163', '\040', '\061', + '\012', '\125', '\141', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\142', '\107', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\116', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\143', '\126', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\107', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\151', '\167', '\125', '\040', '\151', '\156', '\040', '\061', + '\012', '\103', '\156', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\162', '\130', '\144', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\127', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\107', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\142', '\131', '\040', '\142', '\145', '\040', '\061', + '\012', '\150', '\172', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\127', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\115', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\152', '\172', '\127', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\114', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\132', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\110', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\126', '\167', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\166', '\164', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\145', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\170', '\107', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\121', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\107', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\166', '\101', '\040', '\143', '\150', '\040', '\061', + '\012', '\157', '\124', '\155', '\040', '\157', '\156', '\040', '\061', + '\012', '\160', '\152', '\131', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\125', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\152', '\167', '\125', '\040', '\151', '\152', '\040', '\061', + '\012', '\112', '\147', '\155', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\146', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\145', '\117', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\102', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\102', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\123', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\171', '\120', '\040', '\151', '\152', '\040', '\061', + '\012', '\106', '\153', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\152', '\123', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\164', '\101', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\155', '\146', '\040', '\155', '\145', '\040', '\061', + '\012', '\131', '\164', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\120', '\161', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\167', '\112', '\040', '\167', '\141', '\040', '\061', + '\012', '\157', '\127', '\146', '\040', '\157', '\156', '\040', '\061', + '\012', '\153', '\170', '\112', '\040', '\153', '\141', '\040', '\061', + '\012', '\152', '\110', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\143', '\120', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\102', '\163', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\153', '\113', '\040', '\153', '\141', '\040', '\061', + '\012', '\166', '\144', '\121', '\040', '\144', '\145', '\040', '\061', + '\012', '\160', '\152', '\132', '\040', '\151', '\152', '\040', '\061', + '\012', '\126', '\147', '\146', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\166', '\107', '\040', '\163', '\164', '\040', '\061', + '\012', '\153', '\107', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\127', '\152', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\121', '\155', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\107', '\154', '\166', '\040', '\154', '\145', '\040', '\061', + '\012', '\164', '\155', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\154', '\131', '\040', '\154', '\145', '\040', '\061', + '\012', '\120', '\143', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\121', '\167', '\040', '\167', '\151', '\040', '\061', + '\012', '\170', '\141', '\117', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\146', '\116', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\107', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\166', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\167', '\101', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\155', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\166', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\102', '\160', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\112', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\155', '\132', '\040', '\166', '\141', '\040', '\061', + '\012', '\156', '\112', '\160', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\161', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\110', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\121', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\107', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\121', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\102', '\160', '\040', '\155', '\145', '\040', '\061', + '\012', '\164', '\160', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\153', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\165', '\125', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\144', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\146', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\114', '\166', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\151', '\130', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\117', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\150', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\115', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\106', '\163', '\167', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\101', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\167', '\112', '\040', '\167', '\141', '\040', '\061', + '\012', '\146', '\120', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\104', '\146', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\132', '\142', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\102', '\147', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\121', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\153', '\121', '\160', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\157', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\125', '\161', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\131', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\163', '\104', '\146', '\040', '\163', '\164', '\040', '\061', + '\012', '\170', '\165', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\122', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\121', '\163', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\124', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\121', '\170', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\110', '\166', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\132', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\104', '\165', '\040', '\165', '\156', '\040', '\061', + '\012', '\146', '\170', '\101', '\040', '\146', '\157', '\040', '\061', + '\012', '\170', '\120', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\167', '\130', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\112', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\144', '\113', '\040', '\144', '\145', '\040', '\061', + '\012', '\147', '\160', '\127', '\040', '\156', '\147', '\040', '\061', + '\012', '\121', '\147', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\170', '\107', '\040', '\153', '\141', '\040', '\061', + '\012', '\144', '\114', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\102', '\167', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\126', '\144', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\121', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\163', '\170', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\123', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\125', '\153', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\120', '\152', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\162', '\106', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\152', '\120', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\127', '\166', '\040', '\153', '\141', '\040', '\061', + '\012', '\113', '\150', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\107', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\156', '\104', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\131', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\147', '\122', '\040', '\156', '\147', '\040', '\061', + '\012', '\162', '\152', '\103', '\040', '\145', '\162', '\040', '\061', + '\012', '\130', '\152', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\153', '\172', '\105', '\040', '\163', '\172', '\040', '\061', + '\012', '\121', '\147', '\161', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\147', '\142', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\150', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\153', '\117', '\040', '\153', '\141', '\040', '\061', + '\012', '\165', '\167', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\120', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\130', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\147', '\101', '\157', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\166', '\107', '\040', '\153', '\141', '\040', '\061', + '\012', '\166', '\143', '\130', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\117', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\130', '\172', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\106', '\155', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\107', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\152', '\122', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\153', '\111', '\040', '\153', '\165', '\040', '\061', + '\012', '\160', '\161', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\156', '\110', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\150', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\144', '\122', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\104', '\146', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\111', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\103', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\122', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\113', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\111', '\165', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\161', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\105', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\146', '\117', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\165', '\112', '\040', '\165', '\156', '\040', '\061', + '\012', '\156', '\122', '\160', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\170', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\146', '\132', '\040', '\156', '\171', '\040', '\061', + '\012', '\157', '\161', '\124', '\040', '\150', '\157', '\040', '\061', + '\012', '\143', '\147', '\130', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\142', '\114', '\040', '\160', '\162', '\040', '\061', + '\012', '\130', '\155', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\126', '\152', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\171', '\154', '\131', '\040', '\154', '\145', '\040', '\061', + '\012', '\144', '\146', '\113', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\147', '\104', '\040', '\156', '\147', '\040', '\061', + '\012', '\165', '\167', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\120', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\103', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\160', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\161', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\112', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\172', '\121', '\040', '\154', '\145', '\040', '\061', + '\012', '\146', '\147', '\115', '\040', '\156', '\147', '\040', '\061', + '\012', '\131', '\154', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\124', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\122', '\152', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\122', '\147', '\152', '\040', '\152', '\157', '\040', '\061', + '\012', '\107', '\153', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\170', '\107', '\040', '\146', '\157', '\040', '\061', + '\012', '\155', '\164', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\147', '\112', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\144', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\110', '\153', '\040', '\151', '\156', '\040', '\061', + '\012', '\107', '\161', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\104', '\152', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\172', '\132', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\106', '\160', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\124', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\164', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\142', '\124', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\166', '\113', '\040', '\144', '\145', '\040', '\061', + '\012', '\103', '\164', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\144', '\107', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\113', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\103', '\154', '\146', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\162', '\125', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\155', '\124', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\130', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\172', '\117', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\130', '\156', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\162', '\172', '\121', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\121', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\160', '\124', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\131', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\114', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\130', '\147', '\144', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\132', '\154', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\106', '\171', '\040', '\154', '\145', '\040', '\061', + '\012', '\132', '\156', '\147', '\040', '\141', '\156', '\040', '\061', + '\012', '\141', '\130', '\147', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\142', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\143', '\131', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\161', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\102', '\154', '\170', '\040', '\154', '\145', '\040', '\061', + '\012', '\157', '\161', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\120', '\166', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\132', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\144', '\132', '\040', '\144', '\145', '\040', '\061', + '\012', '\102', '\161', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\160', '\107', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\144', '\120', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\165', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\142', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\150', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\167', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\153', '\117', '\040', '\153', '\157', '\040', '\061', + '\012', '\147', '\163', '\131', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\107', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\153', '\166', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\160', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\162', '\167', '\113', '\040', '\145', '\162', '\040', '\061', + '\012', '\114', '\150', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\165', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\161', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\143', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\127', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\143', '\156', '\106', '\040', '\141', '\156', '\040', '\061', + '\012', '\154', '\127', '\167', '\040', '\154', '\145', '\040', '\061', + '\012', '\164', '\170', '\123', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\156', '\105', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\124', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\154', '\106', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\144', '\112', '\040', '\144', '\145', '\040', '\061', + '\012', '\145', '\126', '\153', '\040', '\145', '\162', '\040', '\061', + '\012', '\172', '\152', '\132', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\120', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\161', '\121', '\040', '\143', '\150', '\040', '\061', + '\012', '\120', '\143', '\147', '\040', '\143', '\150', '\040', '\061', + '\012', '\131', '\144', '\153', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\166', '\105', '\040', '\163', '\164', '\040', '\061', + '\012', '\127', '\161', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\143', '\126', '\040', '\143', '\150', '\040', '\061', + '\012', '\156', '\110', '\170', '\040', '\157', '\156', '\040', '\061', + '\012', '\167', '\101', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\150', '\146', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\141', '\115', '\166', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\167', '\117', '\040', '\160', '\162', '\040', '\061', + '\012', '\131', '\167', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\143', '\142', '\110', '\040', '\143', '\150', '\040', '\061', + '\012', '\157', '\152', '\132', '\040', '\157', '\156', '\040', '\061', + '\012', '\163', '\165', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\143', '\125', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\161', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\115', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\160', '\170', '\107', '\040', '\160', '\162', '\040', '\061', + '\012', '\162', '\102', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\154', '\131', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\171', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\103', '\166', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\124', '\161', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\123', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\126', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\105', '\161', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\156', '\104', '\040', '\141', '\156', '\040', '\061', + '\012', '\117', '\167', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\170', '\124', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\167', '\152', '\114', '\040', '\151', '\152', '\040', '\061', + '\012', '\122', '\170', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\156', '\127', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\110', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\102', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\116', '\161', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\172', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\167', '\123', '\040', '\167', '\141', '\040', '\061', + '\012', '\103', '\142', '\171', '\040', '\142', '\145', '\040', '\061', + '\012', '\172', '\122', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\167', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\156', '\102', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\111', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\107', '\153', '\040', '\143', '\150', '\040', '\061', + '\012', '\131', '\152', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\147', '\126', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\104', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\121', '\171', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\143', '\110', '\040', '\143', '\150', '\040', '\061', + '\012', '\156', '\170', '\102', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\166', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\147', '\121', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\162', '\122', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\156', '\113', '\040', '\141', '\156', '\040', '\061', + '\012', '\110', '\154', '\162', '\040', '\154', '\145', '\040', '\061', + '\012', '\104', '\156', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\156', '\125', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\103', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\124', '\152', '\166', '\040', '\151', '\152', '\040', '\061', + '\012', '\105', '\160', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\114', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\160', '\132', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\166', '\122', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\161', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\154', '\107', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\166', '\116', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\142', '\115', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\116', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\152', '\172', '\114', '\040', '\163', '\172', '\040', '\061', + '\012', '\127', '\154', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\141', '\131', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\144', '\131', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\146', '\107', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\146', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\102', '\166', '\040', '\153', '\141', '\040', '\061', + '\012', '\142', '\164', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\115', '\161', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\162', '\103', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\165', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\171', '\112', '\040', '\156', '\171', '\040', '\061', + '\012', '\161', '\155', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\153', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\103', '\155', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\130', '\171', '\040', '\142', '\145', '\040', '\061', + '\012', '\131', '\155', '\171', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\170', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\116', '\154', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\172', '\125', '\040', '\146', '\157', '\040', '\061', + '\012', '\122', '\166', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\154', '\111', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\115', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\121', '\150', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\110', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\167', '\114', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\131', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\121', '\170', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\116', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\116', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\155', '\120', '\040', '\151', '\152', '\040', '\061', + '\012', '\120', '\142', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\161', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\125', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\110', '\171', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\144', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\123', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\143', '\127', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\153', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\132', '\164', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\125', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\102', '\155', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\112', '\171', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\144', '\111', '\040', '\144', '\145', '\040', '\061', + '\012', '\156', '\124', '\144', '\040', '\141', '\156', '\040', '\061', + '\012', '\131', '\152', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\121', '\152', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\130', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\167', '\102', '\040', '\157', '\167', '\040', '\061', + '\012', '\153', '\154', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\146', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\104', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\132', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\155', '\161', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\132', '\162', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\155', '\131', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\114', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\121', '\143', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\113', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\161', '\104', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\113', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\142', '\146', '\122', '\040', '\142', '\145', '\040', '\061', + '\012', '\122', '\161', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\150', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\116', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\124', '\143', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\110', '\142', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\114', '\167', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\143', '\132', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\144', '\113', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\160', '\122', '\040', '\160', '\162', '\040', '\061', + '\012', '\154', '\127', '\155', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\116', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\101', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\162', '\126', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\155', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\114', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\151', '\167', '\102', '\040', '\151', '\156', '\040', '\061', + '\012', '\145', '\161', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\161', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\156', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\165', '\157', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\126', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\142', '\125', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\160', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\144', '\132', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\172', '\127', '\040', '\144', '\145', '\040', '\061', + '\012', '\127', '\146', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\132', '\161', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\112', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\127', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\131', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\162', '\152', '\121', '\040', '\145', '\162', '\040', '\061', + '\012', '\144', '\167', '\102', '\040', '\144', '\145', '\040', '\061', + '\012', '\126', '\154', '\170', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\113', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\114', '\170', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\110', '\160', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\155', '\166', '\122', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\115', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\127', '\142', '\040', '\160', '\162', '\040', '\061', + '\012', '\144', '\143', '\127', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\105', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\162', '\163', '\040', '\145', '\162', '\040', '\061', + '\012', '\106', '\164', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\171', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\123', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\127', '\172', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\120', '\172', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\153', '\127', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\167', '\131', '\040', '\167', '\141', '\040', '\061', + '\012', '\157', '\107', '\142', '\040', '\157', '\156', '\040', '\061', + '\012', '\152', '\102', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\121', '\160', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\162', '\127', '\155', '\040', '\145', '\162', '\040', '\061', + '\012', '\163', '\155', '\121', '\040', '\163', '\164', '\040', '\061', + '\012', '\165', '\107', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\153', '\126', '\040', '\153', '\141', '\040', '\061', + '\012', '\167', '\112', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\143', '\152', '\127', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\116', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\167', '\152', '\122', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\104', '\144', '\040', '\167', '\141', '\040', '\061', + '\012', '\154', '\162', '\102', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\150', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\113', '\160', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\116', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\161', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\155', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\112', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\162', '\116', '\040', '\145', '\162', '\040', '\061', + '\012', '\165', '\102', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\125', '\165', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\115', '\172', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\104', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\147', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\144', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\106', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\152', '\125', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\162', '\130', '\040', '\145', '\162', '\040', '\061', + '\012', '\113', '\166', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\162', '\171', '\131', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\172', '\121', '\040', '\163', '\172', '\040', '\061', + '\012', '\117', '\152', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\146', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\126', '\161', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\141', '\121', '\166', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\110', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\111', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\113', '\160', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\144', '\121', '\153', '\040', '\153', '\157', '\040', '\061', + '\012', '\107', '\150', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\132', '\163', '\040', '\143', '\150', '\040', '\061', + '\012', '\156', '\166', '\110', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\167', '\112', '\040', '\151', '\152', '\040', '\061', + '\012', '\144', '\115', '\155', '\040', '\144', '\145', '\040', '\061', + '\012', '\147', '\152', '\111', '\040', '\156', '\147', '\040', '\061', + '\012', '\154', '\120', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\102', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\150', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\114', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\102', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\143', '\165', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\121', '\144', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\160', '\130', '\040', '\160', '\162', '\040', '\061', + '\012', '\155', '\121', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\155', '\122', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\146', '\110', '\040', '\146', '\157', '\040', '\061', + '\012', '\160', '\161', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\164', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\143', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\127', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\120', '\170', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\121', '\155', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\155', '\144', '\130', '\040', '\144', '\145', '\040', '\061', + '\012', '\102', '\170', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\132', '\166', '\040', '\151', '\152', '\040', '\061', + '\012', '\150', '\116', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\142', '\116', '\040', '\142', '\145', '\040', '\061', + '\012', '\142', '\153', '\132', '\040', '\153', '\141', '\040', '\061', + '\012', '\156', '\126', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\154', '\113', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\112', '\152', '\040', '\157', '\156', '\040', '\061', + '\012', '\160', '\102', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\147', '\101', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\170', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\166', '\112', '\040', '\141', '\156', '\040', '\061', + '\012', '\130', '\143', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\106', '\144', '\142', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\101', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\167', '\121', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\164', '\155', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\166', '\132', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\116', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\172', '\113', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\122', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\124', '\154', '\152', '\040', '\154', '\145', '\040', '\061', + '\012', '\151', '\121', '\152', '\040', '\151', '\156', '\040', '\061', + '\012', '\152', '\155', '\125', '\040', '\151', '\152', '\040', '\061', + '\012', '\164', '\142', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\126', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\124', '\166', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\126', '\147', '\040', '\141', '\156', '\040', '\061', + '\012', '\114', '\170', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\166', '\147', '\117', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\146', '\105', '\040', '\144', '\145', '\040', '\061', + '\012', '\156', '\126', '\155', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\113', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\145', '\161', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\124', '\143', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\124', '\153', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\113', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\127', '\153', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\166', '\132', '\040', '\154', '\145', '\040', '\061', + '\012', '\162', '\107', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\153', '\113', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\103', '\142', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\152', '\121', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\132', '\146', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\166', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\147', '\116', '\040', '\156', '\147', '\040', '\061', + '\012', '\113', '\160', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\172', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\170', '\132', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\161', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\147', '\103', '\040', '\156', '\147', '\040', '\061', + '\012', '\106', '\161', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\115', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\152', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\146', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\152', '\116', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\116', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\120', '\172', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\155', '\150', '\117', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\125', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\106', '\150', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\123', '\152', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\150', '\127', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\150', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\107', '\160', '\040', '\154', '\145', '\040', '\061', + '\012', '\144', '\164', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\167', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\162', '\113', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\161', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\143', '\117', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\121', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\121', '\161', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\112', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\130', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\165', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\156', '\160', '\040', '\141', '\156', '\040', '\061', + '\012', '\104', '\154', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\115', '\170', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\171', '\116', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\142', '\155', '\126', '\040', '\155', '\145', '\040', '\061', + '\012', '\146', '\130', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\155', '\167', '\127', '\040', '\155', '\145', '\040', '\061', + '\012', '\154', '\111', '\152', '\040', '\154', '\145', '\040', '\061', + '\012', '\106', '\166', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\125', '\164', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\107', '\153', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\131', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\167', '\126', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\142', '\124', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\111', '\152', '\160', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\156', '\115', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\155', '\117', '\040', '\155', '\145', '\040', '\061', + '\012', '\147', '\121', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\113', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\125', '\146', '\040', '\144', '\145', '\040', '\061', + '\012', '\143', '\123', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\126', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\143', '\131', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\152', '\105', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\131', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\162', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\172', '\113', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\146', '\103', '\040', '\163', '\172', '\040', '\061', + '\012', '\131', '\142', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\147', '\123', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\143', '\126', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\116', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\130', '\153', '\167', '\040', '\153', '\141', '\040', '\061', + '\012', '\124', '\160', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\102', '\167', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\150', '\167', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\121', '\154', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\104', '\163', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\131', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\124', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\161', '\127', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\152', '\124', '\040', '\151', '\152', '\040', '\061', + '\012', '\150', '\152', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\104', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\150', '\123', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\127', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\103', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\171', '\102', '\040', '\151', '\152', '\040', '\061', + '\012', '\165', '\127', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\116', '\156', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\166', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\172', '\126', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\102', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\111', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\122', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\162', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\132', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\153', '\122', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\116', '\172', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\121', '\146', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\116', '\152', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\106', '\171', '\040', '\142', '\145', '\040', '\061', + '\012', '\154', '\150', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\145', '\127', '\152', '\040', '\145', '\162', '\040', '\061', + '\012', '\152', '\142', '\115', '\040', '\151', '\152', '\040', '\061', + '\012', '\130', '\163', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\122', '\163', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\154', '\106', '\040', '\154', '\145', '\040', '\061', + '\012', '\120', '\150', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\127', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\142', '\103', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\147', '\146', '\112', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\126', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\145', '\121', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\143', '\120', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\104', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\124', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\147', '\163', '\040', '\156', '\147', '\040', '\061', + '\012', '\126', '\165', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\146', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\102', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\160', '\124', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\123', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\142', '\104', '\040', '\155', '\145', '\040', '\061', + '\012', '\126', '\167', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\150', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\146', '\120', '\040', '\153', '\141', '\040', '\061', + '\012', '\120', '\167', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\150', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\132', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\122', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\103', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\152', '\116', '\040', '\151', '\152', '\040', '\061', + '\012', '\122', '\161', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\112', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\154', '\122', '\040', '\154', '\145', '\040', '\061', + '\012', '\130', '\155', '\142', '\040', '\155', '\145', '\040', '\061', + '\012', '\112', '\152', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\161', '\111', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\161', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\151', '\126', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\110', '\147', '\165', '\040', '\156', '\147', '\040', '\061', + '\012', '\151', '\110', '\167', '\040', '\151', '\156', '\040', '\061', + '\012', '\145', '\121', '\166', '\040', '\145', '\162', '\040', '\061', + '\012', '\155', '\172', '\105', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\152', '\132', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\116', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\154', '\105', '\040', '\154', '\145', '\040', '\061', + '\012', '\153', '\107', '\160', '\040', '\153', '\141', '\040', '\061', + '\012', '\111', '\161', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\102', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\132', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\104', '\153', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\154', '\110', '\040', '\154', '\145', '\040', '\061', + '\012', '\164', '\170', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\121', '\162', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\117', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\112', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\172', '\142', '\114', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\153', '\104', '\040', '\153', '\141', '\040', '\061', + '\012', '\163', '\143', '\126', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\130', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\111', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\116', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\112', '\146', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\155', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\143', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\167', '\132', '\040', '\153', '\141', '\040', '\061', + '\012', '\165', '\132', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\156', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\165', '\113', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\162', '\130', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\130', '\171', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\143', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\120', '\146', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\167', '\115', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\111', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\165', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\104', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\110', '\152', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\144', '\121', '\146', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\166', '\112', '\040', '\167', '\141', '\040', '\061', + '\012', '\164', '\110', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\131', '\144', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\170', '\111', '\040', '\167', '\141', '\040', '\061', + '\012', '\160', '\117', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\127', '\155', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\150', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\160', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\155', '\103', '\040', '\155', '\145', '\040', '\061', + '\012', '\167', '\143', '\130', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\152', '\110', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\127', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\107', '\144', '\160', '\040', '\144', '\145', '\040', '\061', + '\012', '\114', '\144', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\123', '\142', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\132', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\113', '\167', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\150', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\122', '\146', '\040', '\156', '\171', '\040', '\061', + '\012', '\150', '\167', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\160', '\112', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\155', '\126', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\107', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\161', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\120', '\150', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\127', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\126', '\170', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\163', '\110', '\172', '\040', '\163', '\164', '\040', '\061', + '\012', '\127', '\142', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\142', '\146', '\113', '\040', '\142', '\145', '\040', '\061', + '\012', '\112', '\147', '\154', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\124', '\142', '\040', '\153', '\141', '\040', '\061', + '\012', '\113', '\142', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\153', '\172', '\103', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\113', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\167', '\102', '\040', '\163', '\172', '\040', '\061', + '\012', '\165', '\132', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\164', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\130', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\165', '\172', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\127', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\162', '\110', '\040', '\145', '\162', '\040', '\061', + '\012', '\157', '\121', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\154', '\124', '\040', '\154', '\145', '\040', '\061', + '\012', '\144', '\146', '\111', '\040', '\144', '\145', '\040', '\061', + '\012', '\121', '\155', '\146', '\040', '\155', '\145', '\040', '\061', + '\012', '\163', '\147', '\105', '\040', '\156', '\147', '\040', '\061', + '\012', '\131', '\163', '\170', '\040', '\163', '\164', '\040', '\061', + '\012', '\122', '\172', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\114', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\163', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\161', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\103', '\155', '\040', '\153', '\141', '\040', '\061', + '\012', '\142', '\106', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\151', '\147', '\121', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\122', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\107', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\123', '\172', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\131', '\166', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\153', '\130', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\107', '\156', '\172', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\127', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\104', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\161', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\156', '\110', '\142', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\144', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\117', '\166', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\132', '\156', '\154', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\165', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\114', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\157', '\146', '\121', '\040', '\157', '\156', '\040', '\061', + '\012', '\166', '\131', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\171', '\110', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\161', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\112', '\171', '\040', '\143', '\150', '\040', '\061', + '\012', '\127', '\142', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\154', '\124', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\154', '\127', '\040', '\154', '\145', '\040', '\061', + '\012', '\130', '\170', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\103', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\113', '\146', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\167', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\110', '\153', '\040', '\145', '\162', '\040', '\061', + '\012', '\144', '\142', '\116', '\040', '\144', '\145', '\040', '\061', + '\012', '\165', '\125', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\147', '\116', '\040', '\156', '\147', '\040', '\061', + '\012', '\120', '\170', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\116', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\171', '\112', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\160', '\110', '\040', '\151', '\152', '\040', '\061', + '\012', '\126', '\164', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\152', '\112', '\040', '\163', '\164', '\040', '\061', + '\012', '\121', '\154', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\167', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\107', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\126', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\163', '\121', '\040', '\163', '\164', '\040', '\061', + '\012', '\170', '\156', '\124', '\040', '\141', '\156', '\040', '\061', + '\012', '\162', '\160', '\112', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\172', '\111', '\040', '\163', '\172', '\040', '\061', + '\012', '\132', '\150', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\141', '\104', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\125', '\170', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\120', '\147', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\123', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\113', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\102', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\120', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\126', '\153', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\151', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\153', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\117', '\165', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\157', '\110', '\040', '\157', '\156', '\040', '\061', + '\012', '\161', '\126', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\107', '\170', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\152', '\172', '\106', '\040', '\163', '\172', '\040', '\061', + '\012', '\163', '\167', '\110', '\040', '\163', '\164', '\040', '\061', + '\012', '\156', '\102', '\142', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\150', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\122', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\156', '\130', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\157', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\170', '\120', '\040', '\155', '\145', '\040', '\061', + '\012', '\142', '\167', '\122', '\040', '\167', '\141', '\040', '\061', + '\012', '\147', '\112', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\156', '\153', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\115', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\170', '\117', '\040', '\144', '\145', '\040', '\061', + '\012', '\162', '\172', '\126', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\160', '\120', '\040', '\166', '\141', '\040', '\061', + '\012', '\116', '\166', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\116', '\146', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\103', '\156', '\172', '\040', '\141', '\156', '\040', '\061', + '\012', '\157', '\124', '\144', '\040', '\157', '\156', '\040', '\061', + '\012', '\144', '\161', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\110', '\155', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\160', '\163', '\130', '\040', '\163', '\164', '\040', '\061', + '\012', '\163', '\167', '\115', '\040', '\163', '\164', '\040', '\061', + '\012', '\144', '\161', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\167', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\156', '\130', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\153', '\131', '\040', '\153', '\141', '\040', '\061', + '\012', '\167', '\146', '\103', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\123', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\126', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\104', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\131', '\166', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\161', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\170', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\113', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\143', '\116', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\127', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\122', '\162', '\172', '\040', '\145', '\162', '\040', '\061', + '\012', '\142', '\155', '\107', '\040', '\155', '\145', '\040', '\061', + '\012', '\163', '\162', '\132', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\127', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\103', '\146', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\116', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\143', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\156', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\112', '\150', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\111', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\123', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\145', '\125', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\111', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\132', '\155', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\145', '\107', '\146', '\040', '\145', '\162', '\040', '\061', + '\012', '\142', '\121', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\130', '\143', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\156', '\154', '\113', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\155', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\154', '\114', '\040', '\154', '\145', '\040', '\061', + '\012', '\155', '\167', '\103', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\152', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\102', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\150', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\120', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\102', '\146', '\040', '\163', '\164', '\040', '\061', + '\012', '\165', '\130', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\153', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\162', '\107', '\172', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\130', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\165', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\166', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\142', '\143', '\112', '\040', '\143', '\150', '\040', '\061', + '\012', '\105', '\157', '\152', '\040', '\157', '\156', '\040', '\061', + '\012', '\151', '\126', '\164', '\040', '\151', '\156', '\040', '\061', + '\012', '\171', '\150', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\126', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\115', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\132', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\126', '\166', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\151', '\103', '\166', '\040', '\151', '\156', '\040', '\061', + '\012', '\166', '\121', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\154', '\102', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\126', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\125', '\147', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\164', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\103', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\166', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\126', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\162', '\120', '\166', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\146', '\110', '\040', '\167', '\141', '\040', '\061', + '\012', '\150', '\142', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\152', '\106', '\040', '\151', '\152', '\040', '\061', + '\012', '\157', '\130', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\123', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\122', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\110', '\143', '\165', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\170', '\112', '\040', '\156', '\171', '\040', '\061', + '\012', '\154', '\124', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\131', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\127', '\170', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\162', '\105', '\040', '\145', '\162', '\040', '\061', + '\012', '\172', '\107', '\171', '\040', '\163', '\172', '\040', '\061', + '\012', '\112', '\161', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\172', '\111', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\147', '\126', '\040', '\147', '\151', '\040', '\061', + '\012', '\122', '\166', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\126', '\156', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\165', '\112', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\106', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\124', '\147', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\141', '\121', '\143', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\172', '\112', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\116', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\146', '\101', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\143', '\117', '\040', '\143', '\150', '\040', '\061', + '\012', '\127', '\153', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\102', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\150', '\147', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\123', '\170', '\040', '\151', '\156', '\040', '\061', + '\012', '\170', '\103', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\171', '\152', '\130', '\040', '\151', '\152', '\040', '\061', + '\012', '\165', '\111', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\147', '\161', '\040', '\156', '\147', '\040', '\061', + '\012', '\124', '\172', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\152', '\117', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\162', '\131', '\040', '\145', '\162', '\040', '\061', + '\012', '\142', '\155', '\132', '\040', '\155', '\145', '\040', '\061', + '\012', '\172', '\161', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\102', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\166', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\143', '\101', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\162', '\130', '\040', '\145', '\162', '\040', '\061', + '\012', '\155', '\112', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\130', '\161', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\120', '\170', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\141', '\104', '\142', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\130', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\145', '\107', '\167', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\152', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\124', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\157', '\115', '\144', '\040', '\157', '\156', '\040', '\061', + '\012', '\146', '\113', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\116', '\160', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\161', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\142', '\106', '\040', '\154', '\145', '\040', '\061', + '\012', '\110', '\166', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\132', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\121', '\152', '\040', '\154', '\145', '\040', '\061', + '\012', '\144', '\153', '\131', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\132', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\132', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\171', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\155', '\112', '\040', '\144', '\145', '\040', '\061', + '\012', '\153', '\146', '\113', '\040', '\153', '\141', '\040', '\061', + '\012', '\151', '\120', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\167', '\125', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\166', '\123', '\040', '\166', '\141', '\040', '\061', + '\012', '\151', '\150', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\143', '\127', '\040', '\143', '\150', '\040', '\061', + '\012', '\112', '\152', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\155', '\115', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\160', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\103', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\113', '\163', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\154', '\111', '\040', '\154', '\145', '\040', '\061', + '\012', '\116', '\155', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\172', '\126', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\132', '\163', '\040', '\156', '\147', '\040', '\061', + '\012', '\162', '\122', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\125', '\146', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\160', '\106', '\040', '\160', '\162', '\040', '\061', + '\012', '\146', '\167', '\131', '\040', '\167', '\141', '\040', '\061', + '\012', '\107', '\170', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\114', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\172', '\105', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\122', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\162', '\122', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\153', '\132', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\125', '\171', '\040', '\144', '\145', '\040', '\061', + '\012', '\130', '\152', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\113', '\144', '\142', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\160', '\103', '\040', '\151', '\152', '\040', '\061', + '\012', '\157', '\125', '\152', '\040', '\157', '\156', '\040', '\061', + '\012', '\161', '\155', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\152', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\122', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\150', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\122', '\150', '\162', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\164', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\120', '\152', '\161', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\167', '\125', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\171', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\170', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\120', '\161', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\122', '\144', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\161', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\106', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\115', '\167', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\152', '\105', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\116', '\170', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\120', '\172', '\155', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\146', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\106', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\121', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\102', '\156', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\154', '\115', '\166', '\040', '\154', '\145', '\040', '\061', + '\012', '\164', '\113', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\145', '\126', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\124', '\171', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\162', '\112', '\040', '\145', '\162', '\040', '\061', + '\012', '\157', '\110', '\167', '\040', '\157', '\156', '\040', '\061', + '\012', '\154', '\106', '\153', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\160', '\127', '\040', '\151', '\152', '\040', '\061', + '\012', '\121', '\152', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\116', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\102', '\150', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\150', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\104', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\170', '\160', '\131', '\040', '\160', '\162', '\040', '\061', + '\012', '\164', '\156', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\146', '\114', '\040', '\144', '\145', '\040', '\061', + '\012', '\150', '\172', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\116', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\102', '\155', '\040', '\154', '\145', '\040', '\061', + '\012', '\154', '\130', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\171', '\120', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\132', '\143', '\154', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\115', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\112', '\152', '\040', '\162', '\151', '\040', '\061', + '\012', '\141', '\130', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\163', '\121', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\121', '\155', '\040', '\143', '\150', '\040', '\061', + '\012', '\123', '\161', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\113', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\166', '\117', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\107', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\142', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\103', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\154', '\107', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\104', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\104', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\122', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\166', '\130', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\161', '\151', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\106', '\163', '\040', '\143', '\150', '\040', '\061', + '\012', '\114', '\150', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\105', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\146', '\121', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\112', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\172', '\117', '\040', '\154', '\145', '\040', '\061', + '\012', '\106', '\170', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\164', '\104', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\156', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\170', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\107', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\166', '\107', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\160', '\103', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\170', '\104', '\040', '\160', '\162', '\040', '\061', + '\012', '\132', '\146', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\157', '\127', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\166', '\126', '\040', '\166', '\141', '\040', '\061', + '\012', '\107', '\167', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\131', '\143', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\143', '\132', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\115', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\171', '\121', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\165', '\107', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\116', '\152', '\040', '\154', '\145', '\040', '\061', + '\012', '\131', '\143', '\155', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\111', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\171', '\114', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\155', '\122', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\156', '\162', '\113', '\040', '\141', '\156', '\040', '\061', + '\012', '\132', '\171', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\116', '\143', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\155', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\120', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\127', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\105', '\147', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\116', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\163', '\116', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\160', '\144', '\127', '\040', '\144', '\145', '\040', '\061', + '\012', '\123', '\156', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\162', '\120', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\112', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\164', '\126', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\166', '\103', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\150', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\144', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\155', '\124', '\040', '\155', '\145', '\040', '\061', + '\012', '\114', '\142', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\160', '\112', '\040', '\160', '\162', '\040', '\061', + '\012', '\155', '\131', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\167', '\126', '\040', '\167', '\141', '\040', '\061', + '\012', '\167', '\152', '\104', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\161', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\125', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\144', '\150', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\132', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\164', '\167', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\142', '\115', '\040', '\142', '\145', '\040', '\061', + '\012', '\150', '\147', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\113', '\142', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\112', '\155', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\105', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\117', '\146', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\130', '\154', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\160', '\126', '\040', '\160', '\162', '\040', '\061', + '\012', '\164', '\161', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\125', '\146', '\040', '\160', '\162', '\040', '\061', + '\012', '\124', '\167', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\115', '\147', '\161', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\121', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\171', '\152', '\124', '\040', '\151', '\152', '\040', '\061', + '\012', '\141', '\126', '\144', '\040', '\141', '\156', '\040', '\061', + '\012', '\145', '\110', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\107', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\163', '\162', '\107', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\126', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\154', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\162', '\124', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\122', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\114', '\162', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\162', '\110', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\124', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\143', '\166', '\111', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\161', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\111', '\170', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\170', '\145', '\121', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\116', '\171', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\122', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\165', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\143', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\113', '\172', '\142', '\040', '\142', '\151', '\040', '\061', + '\012', '\127', '\170', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\152', '\115', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\144', '\117', '\040', '\144', '\145', '\040', '\061', + '\012', '\112', '\146', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\142', '\126', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\121', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\156', '\143', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\126', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\123', '\170', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\125', '\142', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\167', '\166', '\103', '\040', '\166', '\141', '\040', '\061', + '\012', '\153', '\150', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\161', '\106', '\040', '\143', '\150', '\040', '\061', + '\012', '\116', '\170', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\104', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\171', '\104', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\151', '\171', '\111', '\040', '\151', '\156', '\040', '\061', + '\012', '\145', '\130', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\161', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\113', '\170', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\163', '\131', '\040', '\163', '\164', '\040', '\061', + '\012', '\124', '\167', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\146', '\161', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\155', '\103', '\040', '\155', '\145', '\040', '\061', + '\012', '\166', '\106', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\156', '\103', '\040', '\141', '\156', '\040', '\061', + '\012', '\156', '\127', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\172', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\113', '\146', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\164', '\121', '\145', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\165', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\154', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\107', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\117', '\161', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\116', '\160', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\150', '\147', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\170', '\115', '\040', '\146', '\157', '\040', '\061', + '\012', '\152', '\123', '\171', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\112', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\152', '\107', '\040', '\151', '\152', '\040', '\061', + '\012', '\164', '\147', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\117', '\147', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\110', '\142', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\114', '\152', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\151', '\166', '\132', '\040', '\151', '\156', '\040', '\061', + '\012', '\142', '\155', '\131', '\040', '\155', '\145', '\040', '\061', + '\012', '\121', '\146', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\167', '\146', '\121', '\040', '\167', '\141', '\040', '\061', + '\012', '\150', '\103', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\165', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\144', '\132', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\126', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\155', '\132', '\146', '\040', '\155', '\145', '\040', '\061', + '\012', '\154', '\117', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\111', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\132', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\170', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\155', '\171', '\040', '\155', '\145', '\040', '\061', + '\012', '\112', '\161', '\151', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\170', '\114', '\040', '\143', '\150', '\040', '\061', + '\012', '\132', '\164', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\144', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\127', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\107', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\127', '\167', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\160', '\102', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\171', '\161', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\131', '\154', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\156', '\127', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\171', '\112', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\107', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\116', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\150', '\106', '\163', '\040', '\164', '\150', '\040', '\061', + '\012', '\131', '\170', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\166', '\112', '\040', '\153', '\141', '\040', '\061', + '\012', '\106', '\170', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\167', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\166', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\122', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\121', '\161', '\151', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\172', '\105', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\116', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\160', '\127', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\143', '\120', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\120', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\143', '\121', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\121', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\171', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\143', '\130', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\155', '\131', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\154', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\105', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\161', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\117', '\150', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\144', '\115', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\114', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\161', '\101', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\167', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\114', '\172', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\161', '\117', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\130', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\113', '\144', '\163', '\040', '\144', '\145', '\040', '\061', + '\012', '\147', '\166', '\125', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\120', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\156', '\132', '\162', '\040', '\141', '\156', '\040', '\061', + '\012', '\110', '\170', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\103', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\146', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\146', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\146', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\161', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\165', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\146', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\154', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\152', '\104', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\164', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\155', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\127', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\121', '\170', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\126', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\155', '\132', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\144', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\161', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\130', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\155', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\146', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\121', '\162', '\040', '\143', '\150', '\040', '\061', + '\012', '\131', '\150', '\162', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\166', '\123', '\040', '\166', '\141', '\040', '\061', + '\012', '\165', '\104', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\144', '\102', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\166', '\105', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\166', '\123', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\122', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\166', '\104', '\040', '\145', '\162', '\040', '\061', + '\012', '\130', '\171', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\112', '\146', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\141', '\102', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\156', '\127', '\143', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\102', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\147', '\131', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\107', '\142', '\040', '\142', '\151', '\040', '\061', + '\012', '\147', '\152', '\105', '\040', '\156', '\147', '\040', '\061', + '\012', '\122', '\154', '\167', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\162', '\124', '\040', '\145', '\162', '\040', '\061', + '\012', '\142', '\121', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\154', '\152', '\131', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\166', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\113', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\160', '\124', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\124', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\156', '\126', '\040', '\141', '\156', '\040', '\061', + '\012', '\162', '\127', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\156', '\127', '\144', '\040', '\141', '\156', '\040', '\061', + '\012', '\156', '\113', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\115', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\153', '\107', '\040', '\153', '\141', '\040', '\061', + '\012', '\142', '\167', '\130', '\040', '\167', '\141', '\040', '\061', + '\012', '\143', '\167', '\126', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\167', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\114', '\166', '\040', '\145', '\162', '\040', '\061', + '\012', '\172', '\115', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\160', '\132', '\040', '\163', '\172', '\040', '\061', + '\012', '\162', '\115', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\124', '\164', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\166', '\117', '\040', '\156', '\147', '\040', '\061', + '\012', '\112', '\143', '\172', '\040', '\143', '\150', '\040', '\061', + '\012', '\103', '\171', '\170', '\040', '\156', '\171', '\040', '\061', + '\012', '\156', '\152', '\130', '\040', '\141', '\156', '\040', '\061', + '\012', '\141', '\126', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\130', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\125', '\161', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\126', '\172', '\040', '\144', '\145', '\040', '\061', + '\012', '\122', '\143', '\160', '\040', '\143', '\150', '\040', '\061', + '\012', '\145', '\113', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\130', '\172', '\156', '\040', '\151', '\156', '\040', '\061', + '\012', '\166', '\171', '\106', '\040', '\166', '\141', '\040', '\061', + '\012', '\113', '\154', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\144', '\111', '\040', '\144', '\145', '\040', '\061', + '\012', '\110', '\161', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\105', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\160', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\104', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\112', '\150', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\165', '\113', '\040', '\165', '\156', '\040', '\061', + '\012', '\166', '\147', '\125', '\040', '\156', '\147', '\040', '\061', + '\012', '\162', '\127', '\166', '\040', '\145', '\162', '\040', '\061', + '\012', '\120', '\156', '\155', '\040', '\141', '\156', '\040', '\061', + '\012', '\156', '\114', '\155', '\040', '\141', '\156', '\040', '\061', + '\012', '\102', '\150', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\120', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\160', '\111', '\040', '\151', '\152', '\040', '\061', + '\012', '\164', '\114', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\160', '\123', '\040', '\166', '\141', '\040', '\061', + '\012', '\106', '\170', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\104', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\172', '\115', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\167', '\112', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\102', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\107', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\114', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\102', '\152', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\146', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\154', '\127', '\040', '\143', '\150', '\040', '\061', + '\012', '\122', '\147', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\107', '\163', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\125', '\166', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\121', '\147', '\166', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\146', '\130', '\040', '\156', '\147', '\040', '\061', + '\012', '\162', '\121', '\166', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\166', '\107', '\040', '\166', '\141', '\040', '\061', + '\012', '\153', '\152', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\144', '\107', '\146', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\143', '\101', '\040', '\143', '\150', '\040', '\061', + '\012', '\105', '\150', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\102', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\107', '\160', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\164', '\102', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\146', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\112', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\163', '\161', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\162', '\131', '\040', '\145', '\162', '\040', '\061', + '\012', '\104', '\161', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\172', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\115', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\146', '\115', '\040', '\156', '\171', '\040', '\061', + '\012', '\107', '\170', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\167', '\172', '\120', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\116', '\155', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\113', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\122', '\162', '\144', '\040', '\145', '\162', '\040', '\061', + '\012', '\110', '\166', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\146', '\104', '\040', '\156', '\147', '\040', '\061', + '\012', '\127', '\155', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\112', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\156', '\124', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\165', '\166', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\120', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\167', '\122', '\040', '\166', '\141', '\040', '\061', + '\012', '\142', '\115', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\167', '\111', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\170', '\131', '\040', '\153', '\141', '\040', '\061', + '\012', '\147', '\132', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\106', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\115', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\110', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\126', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\154', '\130', '\040', '\154', '\145', '\040', '\061', + '\012', '\146', '\163', '\114', '\040', '\163', '\164', '\040', '\061', + '\012', '\160', '\122', '\146', '\040', '\160', '\162', '\040', '\061', + '\012', '\172', '\163', '\130', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\102', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\172', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\144', '\122', '\040', '\144', '\145', '\040', '\061', + '\012', '\132', '\154', '\172', '\040', '\154', '\145', '\040', '\061', + '\012', '\127', '\146', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\122', '\152', '\166', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\106', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\153', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\142', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\170', '\121', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\113', '\170', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\170', '\103', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\156', '\161', '\126', '\040', '\141', '\156', '\040', '\061', + '\012', '\127', '\167', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\153', '\144', '\127', '\040', '\144', '\145', '\040', '\061', + '\012', '\160', '\153', '\111', '\040', '\153', '\141', '\040', '\061', + '\012', '\157', '\150', '\123', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\144', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\103', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\170', '\114', '\040', '\163', '\164', '\040', '\061', + '\012', '\121', '\162', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\130', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\161', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\151', '\152', '\113', '\040', '\151', '\156', '\040', '\061', + '\012', '\163', '\106', '\172', '\040', '\163', '\164', '\040', '\061', + '\012', '\110', '\154', '\167', '\040', '\154', '\145', '\040', '\061', + '\012', '\107', '\161', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\120', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\167', '\132', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\161', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\172', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\102', '\144', '\172', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\121', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\164', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\125', '\171', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\127', '\143', '\171', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\161', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\102', '\156', '\163', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\104', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\112', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\127', '\146', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\150', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\127', '\160', '\040', '\143', '\150', '\040', '\061', + '\012', '\162', '\161', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\153', '\102', '\040', '\153', '\141', '\040', '\061', + '\012', '\127', '\164', '\154', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\172', '\146', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\115', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\160', '\170', '\116', '\040', '\160', '\162', '\040', '\061', + '\012', '\166', '\150', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\161', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\113', '\144', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\121', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\171', '\153', '\103', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\115', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\105', '\161', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\130', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\155', '\132', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\160', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\107', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\124', '\152', '\170', '\040', '\172', '\152', '\040', '\061', + '\012', '\164', '\166', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\131', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\106', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\151', '\112', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\120', '\153', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\143', '\104', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\131', '\171', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\126', '\143', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\150', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\116', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\143', '\104', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\156', '\127', '\040', '\141', '\156', '\040', '\061', + '\012', '\165', '\166', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\172', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\120', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\167', '\104', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\160', '\117', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\104', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\166', '\105', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\132', '\143', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\162', '\130', '\040', '\145', '\162', '\040', '\061', + '\012', '\144', '\150', '\123', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\152', '\112', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\104', '\153', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\162', '\112', '\040', '\145', '\162', '\040', '\061', + '\012', '\141', '\127', '\147', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\166', '\112', '\040', '\166', '\141', '\040', '\061', + '\012', '\131', '\164', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\151', '\121', '\040', '\151', '\156', '\040', '\061', + '\012', '\164', '\106', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\112', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\132', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\125', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\157', '\161', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\104', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\146', '\105', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\123', '\142', '\040', '\155', '\145', '\040', '\061', + '\012', '\152', '\155', '\122', '\040', '\151', '\152', '\040', '\061', + '\012', '\162', '\106', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\130', '\152', '\171', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\120', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\151', '\161', '\121', '\040', '\164', '\151', '\040', '\061', + '\012', '\155', '\146', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\170', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\102', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\130', '\166', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\166', '\131', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\144', '\115', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\147', '\131', '\040', '\156', '\147', '\040', '\061', + '\012', '\162', '\131', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\154', '\101', '\040', '\154', '\145', '\040', '\061', + '\012', '\160', '\106', '\142', '\040', '\160', '\162', '\040', '\061', + '\012', '\171', '\106', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\143', '\113', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\146', '\132', '\040', '\146', '\157', '\040', '\061', + '\012', '\152', '\104', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\116', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\164', '\113', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\164', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\110', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\103', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\143', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\104', '\167', '\040', '\153', '\141', '\040', '\061', + '\012', '\131', '\167', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\130', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\171', '\115', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\107', '\167', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\131', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\103', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\152', '\132', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\157', '\121', '\144', '\040', '\157', '\156', '\040', '\061', + '\012', '\106', '\172', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\167', '\106', '\040', '\154', '\145', '\040', '\061', + '\012', '\130', '\172', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\116', '\152', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\157', '\111', '\040', '\157', '\156', '\040', '\061', + '\012', '\163', '\112', '\155', '\040', '\163', '\164', '\040', '\061', + '\012', '\167', '\113', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\121', '\164', '\150', '\040', '\143', '\150', '\040', '\061', + '\012', '\114', '\154', '\172', '\040', '\154', '\145', '\040', '\061', + '\012', '\147', '\126', '\146', '\040', '\147', '\151', '\040', '\061', + '\012', '\160', '\120', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\107', '\171', '\040', '\154', '\145', '\040', '\061', + '\012', '\147', '\172', '\122', '\040', '\156', '\147', '\040', '\061', + '\012', '\162', '\130', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\116', '\160', '\146', '\040', '\160', '\162', '\040', '\061', + '\012', '\167', '\166', '\122', '\040', '\166', '\141', '\040', '\061', + '\012', '\171', '\130', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\155', '\115', '\154', '\040', '\154', '\151', '\040', '\061', + '\012', '\142', '\131', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\146', '\172', '\132', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\162', '\107', '\040', '\145', '\162', '\040', '\061', + '\012', '\113', '\144', '\153', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\161', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\153', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\113', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\132', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\120', '\146', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\162', '\154', '\127', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\120', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\117', '\152', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\107', '\164', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\164', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\154', '\171', '\040', '\154', '\145', '\040', '\061', + '\012', '\171', '\110', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\153', '\121', '\142', '\040', '\153', '\141', '\040', '\061', + '\012', '\114', '\144', '\143', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\125', '\170', '\040', '\163', '\164', '\040', '\061', + '\012', '\143', '\112', '\147', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\114', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\115', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\103', '\152', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\141', '\167', '\130', '\040', '\141', '\156', '\040', '\061', + '\012', '\107', '\164', '\154', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\172', '\116', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\101', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\145', '\172', '\130', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\102', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\163', '\130', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\125', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\163', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\163', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\172', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\121', '\147', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\116', '\170', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\110', '\161', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\162', '\130', '\154', '\040', '\145', '\162', '\040', '\061', + '\012', '\156', '\154', '\120', '\040', '\141', '\156', '\040', '\061', + '\012', '\141', '\126', '\147', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\150', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\146', '\101', '\040', '\153', '\141', '\040', '\061', + '\012', '\126', '\155', '\153', '\040', '\155', '\107', '\040', '\061', + '\012', '\152', '\113', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\150', '\120', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\141', '\120', '\144', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\131', '\171', '\040', '\142', '\145', '\040', '\061', + '\012', '\142', '\156', '\132', '\040', '\141', '\156', '\040', '\061', + '\012', '\107', '\163', '\152', '\040', '\163', '\164', '\040', '\061', + '\012', '\153', '\170', '\121', '\040', '\153', '\141', '\040', '\061', + '\012', '\166', '\153', '\106', '\040', '\153', '\141', '\040', '\061', + '\012', '\152', '\172', '\123', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\127', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\121', '\143', '\165', '\040', '\143', '\150', '\040', '\061', + '\012', '\162', '\132', '\146', '\040', '\145', '\162', '\040', '\061', + '\012', '\152', '\142', '\132', '\040', '\151', '\152', '\040', '\061', + '\012', '\141', '\121', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\172', '\117', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\132', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\162', '\116', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\153', '\114', '\040', '\153', '\141', '\040', '\061', + '\012', '\104', '\161', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\153', '\103', '\040', '\163', '\172', '\040', '\061', + '\012', '\163', '\114', '\167', '\040', '\163', '\164', '\040', '\061', + '\012', '\116', '\166', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\116', '\142', '\171', '\040', '\142', '\145', '\040', '\061', + '\012', '\145', '\115', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\106', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\103', '\170', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\151', '\132', '\160', '\040', '\151', '\156', '\040', '\061', + '\012', '\144', '\166', '\132', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\111', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\103', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\120', '\172', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\166', '\116', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\161', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\155', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\170', '\126', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\154', '\104', '\040', '\156', '\147', '\040', '\061', + '\012', '\107', '\142', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\112', '\166', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\106', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\115', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\153', '\112', '\040', '\153', '\141', '\040', '\061', + '\012', '\123', '\170', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\141', '\146', '\125', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\110', '\142', '\040', '\155', '\145', '\040', '\061', + '\012', '\152', '\170', '\125', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\112', '\154', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\161', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\116', '\161', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\107', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\172', '\107', '\040', '\143', '\150', '\040', '\061', + '\012', '\113', '\146', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\127', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\130', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\146', '\156', '\104', '\040', '\141', '\156', '\040', '\061', + '\012', '\112', '\162', '\144', '\040', '\145', '\162', '\040', '\061', + '\012', '\157', '\170', '\132', '\040', '\157', '\156', '\040', '\061', + '\012', '\150', '\130', '\156', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\161', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\101', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\151', '\107', '\153', '\040', '\151', '\156', '\040', '\061', + '\012', '\170', '\105', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\146', '\126', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\164', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\150', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\157', '\121', '\172', '\040', '\157', '\156', '\040', '\061', + '\012', '\160', '\147', '\117', '\040', '\156', '\147', '\040', '\061', + '\012', '\131', '\161', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\112', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\153', '\143', '\126', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\156', '\115', '\040', '\141', '\156', '\040', '\061', + '\012', '\103', '\167', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\127', '\147', '\144', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\160', '\124', '\040', '\160', '\162', '\040', '\061', + '\012', '\112', '\144', '\152', '\040', '\144', '\145', '\040', '\061', + '\012', '\116', '\142', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\167', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\145', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\113', '\144', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\121', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\120', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\127', '\160', '\040', '\154', '\145', '\040', '\061', + '\012', '\106', '\142', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\126', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\154', '\111', '\040', '\154', '\145', '\040', '\061', + '\012', '\102', '\172', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\146', '\113', '\040', '\151', '\152', '\040', '\061', + '\012', '\131', '\166', '\155', '\040', '\166', '\141', '\040', '\061', + '\012', '\106', '\164', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\141', '\115', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\172', '\126', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\117', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\110', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\127', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\106', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\104', '\166', '\040', '\163', '\164', '\040', '\061', + '\012', '\166', '\155', '\104', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\152', '\114', '\040', '\151', '\152', '\040', '\061', + '\012', '\151', '\102', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\161', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\163', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\170', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\152', '\163', '\107', '\040', '\163', '\164', '\040', '\061', + '\012', '\143', '\130', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\131', '\142', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\145', '\112', '\040', '\145', '\162', '\040', '\061', + '\012', '\157', '\120', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\130', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\166', '\114', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\143', '\106', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\106', '\142', '\040', '\153', '\141', '\040', '\061', + '\012', '\152', '\130', '\166', '\040', '\151', '\152', '\040', '\061', + '\012', '\101', '\157', '\170', '\040', '\157', '\156', '\040', '\061', + '\012', '\172', '\153', '\121', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\120', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\106', '\166', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\142', '\130', '\040', '\142', '\145', '\040', '\061', + '\012', '\157', '\103', '\146', '\040', '\157', '\156', '\040', '\061', + '\012', '\131', '\152', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\120', '\160', '\146', '\040', '\160', '\162', '\040', '\061', + '\012', '\116', '\152', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\143', '\132', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\156', '\107', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\167', '\112', '\040', '\143', '\155', '\040', '\061', + '\012', '\161', '\112', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\116', '\146', '\040', '\156', '\147', '\040', '\061', + '\012', '\124', '\146', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\167', '\113', '\040', '\166', '\141', '\040', '\061', + '\012', '\132', '\143', '\163', '\040', '\143', '\150', '\040', '\061', + '\012', '\145', '\102', '\166', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\114', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\161', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\162', '\104', '\040', '\143', '\150', '\040', '\061', + '\012', '\111', '\143', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\102', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\172', '\130', '\040', '\156', '\147', '\040', '\061', + '\012', '\165', '\152', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\170', '\125', '\040', '\166', '\141', '\040', '\061', + '\012', '\153', '\132', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\114', '\144', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\146', '\115', '\040', '\142', '\145', '\040', '\061', + '\012', '\155', '\121', '\155', '\040', '\121', '\117', '\040', '\061', + '\012', '\172', '\154', '\121', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\142', '\125', '\040', '\151', '\152', '\040', '\061', + '\012', '\113', '\166', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\125', '\170', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\160', '\152', '\123', '\040', '\151', '\152', '\040', '\061', + '\012', '\130', '\166', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\153', '\152', '\111', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\131', '\151', '\040', '\143', '\150', '\040', '\061', + '\012', '\156', '\112', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\121', '\170', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\141', '\116', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\112', '\146', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\142', '\116', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\144', '\121', '\040', '\144', '\145', '\040', '\061', + '\012', '\102', '\172', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\132', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\143', '\160', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\107', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\153', '\103', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\147', '\167', '\120', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\142', '\126', '\040', '\167', '\141', '\040', '\061', + '\012', '\105', '\161', '\164', '\040', '\145', '\161', '\040', '\061', + '\012', '\130', '\150', '\156', '\040', '\164', '\150', '\040', '\061', + '\012', '\157', '\125', '\146', '\040', '\157', '\156', '\040', '\061', + '\012', '\144', '\113', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\170', '\116', '\040', '\163', '\164', '\040', '\061', + '\012', '\117', '\146', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\103', '\160', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\150', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\147', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\156', '\125', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\152', '\124', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\163', '\132', '\040', '\163', '\164', '\040', '\061', + '\012', '\154', '\107', '\166', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\115', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\165', '\153', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\150', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\122', '\167', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\122', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\167', '\113', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\112', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\164', '\126', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\161', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\151', '\131', '\154', '\040', '\151', '\156', '\040', '\061', + '\012', '\170', '\114', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\130', '\144', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\143', '\117', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\154', '\115', '\040', '\154', '\145', '\040', '\061', + '\012', '\142', '\104', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\116', '\155', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\144', '\113', '\166', '\040', '\144', '\145', '\040', '\061', + '\012', '\150', '\120', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\124', '\152', '\171', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\131', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\156', '\146', '\112', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\146', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\112', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\113', '\160', '\040', '\154', '\145', '\040', '\061', + '\012', '\111', '\171', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\165', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\145', '\113', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\163', '\132', '\146', '\040', '\163', '\164', '\040', '\061', + '\012', '\172', '\160', '\121', '\040', '\163', '\172', '\040', '\061', + '\012', '\163', '\146', '\114', '\040', '\163', '\164', '\040', '\061', + '\012', '\155', '\152', '\124', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\130', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\113', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\167', '\126', '\040', '\145', '\162', '\040', '\061', + '\012', '\160', '\152', '\102', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\131', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\131', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\161', '\131', '\040', '\145', '\161', '\040', '\061', + '\012', '\165', '\111', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\124', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\161', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\112', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\107', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\167', '\106', '\040', '\163', '\164', '\040', '\061', + '\012', '\110', '\146', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\110', '\164', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\146', '\127', '\040', '\150', '\127', '\040', '\061', + '\012', '\151', '\171', '\107', '\040', '\151', '\156', '\040', '\061', + '\012', '\172', '\120', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\172', '\126', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\126', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\163', '\120', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\113', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\145', '\106', '\142', '\040', '\145', '\162', '\040', '\061', + '\012', '\121', '\152', '\151', '\040', '\152', '\123', '\040', '\061', + '\012', '\155', '\164', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\147', '\132', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\110', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\124', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\170', '\132', '\040', '\156', '\147', '\040', '\061', + '\012', '\113', '\164', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\127', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\127', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\123', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\106', '\172', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\150', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\160', '\127', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\166', '\120', '\040', '\151', '\152', '\040', '\061', + '\012', '\165', '\131', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\125', '\170', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\123', '\161', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\143', '\112', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\115', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\132', '\147', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\107', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\126', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\125', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\157', '\161', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\107', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\131', '\142', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\122', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\162', '\132', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\124', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\132', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\147', '\117', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\112', '\152', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\120', '\160', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\161', '\167', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\143', '\112', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\106', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\167', '\131', '\040', '\167', '\141', '\040', '\061', + '\012', '\153', '\124', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\107', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\145', '\121', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\107', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\160', '\126', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\124', '\155', '\040', '\166', '\141', '\040', '\061', + '\012', '\117', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\160', '\130', '\040', '\144', '\145', '\040', '\061', + '\012', '\142', '\131', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\164', '\152', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\114', '\172', '\156', '\040', '\114', '\107', '\040', '\061', + '\012', '\131', '\152', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\165', '\131', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\144', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\130', '\163', '\040', '\164', '\150', '\040', '\061', + '\012', '\111', '\167', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\150', '\112', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\124', '\146', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\143', '\170', '\117', '\040', '\143', '\150', '\040', '\061', + '\012', '\121', '\161', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\104', '\166', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\163', '\117', '\040', '\163', '\164', '\040', '\061', + '\012', '\155', '\162', '\107', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\152', '\112', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\147', '\104', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\125', '\167', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\144', '\102', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\154', '\125', '\040', '\154', '\145', '\040', '\061', + '\012', '\142', '\102', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\161', '\142', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\154', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\127', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\147', '\142', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\162', '\125', '\040', '\145', '\162', '\040', '\061', + '\012', '\142', '\147', '\111', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\152', '\112', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\166', '\125', '\040', '\166', '\141', '\040', '\061', + '\012', '\162', '\103', '\160', '\040', '\107', '\103', '\040', '\061', + '\012', '\156', '\126', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\142', '\107', '\040', '\142', '\145', '\040', '\061', + '\012', '\164', '\144', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\152', '\122', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\121', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\172', '\132', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\125', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\152', '\131', '\040', '\151', '\152', '\040', '\061', + '\012', '\112', '\170', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\132', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\166', '\132', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\154', '\122', '\163', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\167', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\160', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\163', '\167', '\123', '\040', '\163', '\164', '\040', '\061', + '\012', '\105', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\105', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\164', '\153', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\147', '\130', '\040', '\156', '\147', '\040', '\061', + '\012', '\122', '\167', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\163', '\152', '\127', '\040', '\163', '\164', '\040', '\061', + '\012', '\144', '\130', '\155', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\166', '\131', '\040', '\166', '\113', '\040', '\061', + '\012', '\154', '\162', '\117', '\040', '\145', '\162', '\040', '\061', + '\012', '\114', '\144', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\143', '\170', '\126', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\106', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\126', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\120', '\171', '\146', '\040', '\156', '\171', '\040', '\061', + '\012', '\113', '\170', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\167', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\160', '\114', '\040', '\143', '\150', '\040', '\061', + '\012', '\110', '\147', '\145', '\040', '\156', '\147', '\040', '\061', + '\012', '\127', '\142', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\121', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\104', '\154', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\160', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\132', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\132', '\161', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\155', '\125', '\040', '\155', '\145', '\040', '\061', + '\012', '\164', '\125', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\127', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\162', '\144', '\040', '\145', '\162', '\040', '\061', + '\012', '\160', '\121', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\162', '\132', '\166', '\040', '\145', '\162', '\040', '\061', + '\012', '\155', '\152', '\111', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\121', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\166', '\107', '\171', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\167', '\131', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\116', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\160', '\120', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\113', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\126', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\164', '\115', '\150', '\040', '\143', '\150', '\040', '\061', + '\012', '\113', '\164', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\160', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\104', '\146', '\040', '\151', '\156', '\040', '\061', + '\012', '\161', '\113', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\114', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\112', '\152', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\143', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\124', '\161', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\107', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\152', '\170', '\126', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\143', '\103', '\040', '\143', '\150', '\040', '\061', + '\012', '\106', '\167', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\120', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\155', '\105', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\155', '\124', '\040', '\155', '\145', '\040', '\061', + '\012', '\154', '\170', '\103', '\040', '\107', '\103', '\040', '\061', + '\012', '\154', '\122', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\121', '\153', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\151', '\150', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\114', '\154', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\113', '\161', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\110', '\150', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\120', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\166', '\121', '\040', '\121', '\117', '\040', '\061', + '\012', '\152', '\107', '\171', '\040', '\151', '\152', '\040', '\061', + '\012', '\154', '\115', '\153', '\040', '\154', '\145', '\040', '\061', + '\012', '\165', '\117', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\144', '\124', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\166', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\143', '\132', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\153', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\142', '\112', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\146', '\113', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\115', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\160', '\106', '\040', '\166', '\141', '\040', '\061', + '\012', '\144', '\147', '\120', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\170', '\106', '\040', '\155', '\145', '\040', '\061', + '\012', '\162', '\132', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\107', '\144', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\120', '\170', '\040', '\163', '\164', '\040', '\061', + '\012', '\162', '\107', '\144', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\142', '\121', '\040', '\156', '\147', '\040', '\061', + '\012', '\104', '\146', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\163', '\152', '\103', '\040', '\163', '\164', '\040', '\061', + '\012', '\172', '\123', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\111', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\111', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\153', '\160', '\106', '\040', '\153', '\141', '\040', '\061', + '\012', '\145', '\125', '\167', '\040', '\145', '\162', '\040', '\061', + '\012', '\110', '\170', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\166', '\107', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\125', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\152', '\106', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\114', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\152', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\114', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\144', '\123', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\167', '\113', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\110', '\171', '\040', '\164', '\150', '\040', '\061', + '\012', '\123', '\163', '\167', '\040', '\163', '\164', '\040', '\061', + '\012', '\150', '\152', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\104', '\144', '\160', '\040', '\144', '\145', '\040', '\061', + '\012', '\142', '\120', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\127', '\160', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\162', '\127', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\160', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\157', '\130', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\152', '\113', '\040', '\151', '\152', '\040', '\061', + '\012', '\126', '\172', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\131', '\144', '\040', '\154', '\145', '\040', '\061', + '\012', '\117', '\144', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\150', '\126', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\122', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\132', '\164', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\126', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\152', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\106', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\114', '\150', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\154', '\117', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\166', '\102', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\142', '\116', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\120', '\155', '\040', '\166', '\141', '\040', '\061', + '\012', '\164', '\121', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\166', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\162', '\161', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\105', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\152', '\163', '\102', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\155', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\164', '\105', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\144', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\104', '\155', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\167', '\111', '\040', '\167', '\141', '\040', '\061', + '\012', '\152', '\160', '\121', '\040', '\151', '\152', '\040', '\061', + '\012', '\165', '\130', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\131', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\157', '\106', '\172', '\040', '\157', '\156', '\040', '\061', + '\012', '\164', '\102', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\103', '\156', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\132', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\162', '\114', '\040', '\145', '\162', '\040', '\061', + '\012', '\112', '\162', '\171', '\040', '\145', '\162', '\040', '\061', + '\012', '\151', '\113', '\144', '\040', '\151', '\156', '\040', '\061', + '\012', '\166', '\143', '\116', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\116', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\156', '\122', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\143', '\110', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\141', '\117', '\040', '\141', '\156', '\040', '\061', + '\012', '\165', '\141', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\170', '\114', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\125', '\146', '\040', '\155', '\145', '\040', '\061', + '\012', '\166', '\117', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\120', '\170', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\165', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\146', '\116', '\040', '\163', '\164', '\040', '\061', + '\012', '\121', '\154', '\166', '\040', '\154', '\145', '\040', '\061', + '\012', '\142', '\132', '\171', '\040', '\142', '\145', '\040', '\061', + '\012', '\166', '\105', '\161', '\040', '\166', '\113', '\040', '\061', + '\012', '\130', '\166', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\112', '\170', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\172', '\107', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\103', '\161', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\120', '\160', '\040', '\163', '\164', '\040', '\061', + '\012', '\166', '\101', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\127', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\162', '\143', '\132', '\040', '\143', '\155', '\040', '\061', + '\012', '\154', '\104', '\163', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\104', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\160', '\123', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\167', '\123', '\040', '\166', '\141', '\040', '\061', + '\012', '\153', '\147', '\121', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\162', '\124', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\113', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\150', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\115', '\154', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\113', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\144', '\106', '\040', '\144', '\145', '\040', '\061', + '\012', '\143', '\146', '\116', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\144', '\117', '\040', '\163', '\164', '\040', '\061', + '\012', '\153', '\110', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\166', '\105', '\040', '\166', '\141', '\040', '\061', + '\012', '\142', '\120', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\162', '\172', '\130', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\123', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\144', '\106', '\146', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\130', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\142', '\122', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\132', '\170', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\130', '\172', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\162', '\122', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\110', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\161', '\145', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\162', '\121', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\153', '\111', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\162', '\131', '\040', '\145', '\162', '\040', '\061', + '\012', '\152', '\161', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\132', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\124', '\155', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\110', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\144', '\161', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\154', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\166', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\113', '\154', '\170', '\040', '\154', '\145', '\040', '\061', + '\012', '\147', '\142', '\123', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\142', '\121', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\165', '\106', '\040', '\165', '\156', '\040', '\061', + '\012', '\161', '\172', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\141', '\111', '\040', '\141', '\156', '\040', '\061', + '\012', '\126', '\155', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\141', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\121', '\153', '\142', '\040', '\153', '\141', '\040', '\061', + '\012', '\130', '\152', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\157', '\103', '\161', '\040', '\107', '\103', '\040', '\061', + '\012', '\161', '\121', '\150', '\040', '\121', '\117', '\040', '\061', + '\012', '\143', '\167', '\117', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\115', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\162', '\113', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\113', '\171', '\040', '\167', '\141', '\040', '\061', + '\012', '\167', '\113', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\143', '\161', '\123', '\040', '\143', '\150', '\040', '\061', + '\012', '\151', '\107', '\166', '\040', '\151', '\156', '\040', '\061', + '\012', '\170', '\130', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\146', '\115', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\132', '\155', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\131', '\161', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\104', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\170', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\171', '\171', '\105', '\040', '\156', '\171', '\040', '\061', + '\012', '\163', '\125', '\166', '\040', '\163', '\164', '\040', '\061', + '\012', '\143', '\126', '\162', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\161', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\147', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\161', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\124', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\151', '\115', '\166', '\040', '\151', '\156', '\040', '\061', + '\012', '\161', '\127', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\144', '\126', '\040', '\144', '\145', '\040', '\061', + '\012', '\157', '\121', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\132', '\160', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\157', '\131', '\040', '\157', '\156', '\040', '\061', + '\012', '\152', '\122', '\153', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\120', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\161', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\161', '\130', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\102', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\160', '\130', '\040', '\160', '\162', '\040', '\061', + '\012', '\142', '\131', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\131', '\145', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\152', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\161', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\150', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\166', '\106', '\040', '\143', '\150', '\040', '\061', + '\012', '\131', '\143', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\106', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\110', '\144', '\171', '\040', '\144', '\145', '\040', '\061', + '\012', '\154', '\162', '\132', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\132', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\124', '\146', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\172', '\162', '\111', '\040', '\145', '\162', '\040', '\061', + '\012', '\144', '\104', '\166', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\145', '\110', '\040', '\145', '\162', '\040', '\061', + '\012', '\154', '\172', '\110', '\040', '\154', '\145', '\040', '\061', + '\012', '\163', '\114', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\151', '\113', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\106', '\172', '\143', '\040', '\143', '\155', '\040', '\061', + '\012', '\170', '\122', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\123', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\167', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\170', '\131', '\040', '\167', '\141', '\040', '\061', + '\012', '\131', '\153', '\167', '\040', '\153', '\141', '\040', '\061', + '\012', '\157', '\126', '\160', '\040', '\157', '\156', '\040', '\061', + '\012', '\143', '\147', '\102', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\106', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\152', '\124', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\132', '\172', '\040', '\144', '\145', '\040', '\061', + '\012', '\142', '\150', '\123', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\172', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\110', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\166', '\116', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\154', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\166', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\160', '\125', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\164', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\121', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\113', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\122', '\167', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\162', '\117', '\040', '\145', '\162', '\040', '\061', + '\012', '\156', '\160', '\102', '\040', '\141', '\156', '\040', '\061', + '\012', '\121', '\164', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\115', '\161', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\117', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\104', '\172', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\126', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\124', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\121', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\124', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\121', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\132', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\112', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\162', '\120', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\161', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\104', '\167', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\126', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\150', '\161', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\112', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\164', '\170', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\132', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\130', '\156', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\146', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\126', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\126', '\160', '\040', '\156', '\147', '\040', '\061', + '\012', '\156', '\102', '\160', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\156', '\132', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\161', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\120', '\172', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\112', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\156', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\113', '\170', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\144', '\130', '\154', '\040', '\130', '\155', '\040', '\061', + '\012', '\150', '\167', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\122', '\162', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\154', '\114', '\040', '\154', '\145', '\040', '\061', + '\012', '\146', '\117', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\121', '\167', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\103', '\155', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\106', '\142', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\150', '\127', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\123', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\102', '\170', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\172', '\143', '\102', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\166', '\130', '\040', '\154', '\145', '\040', '\061', + '\012', '\113', '\153', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\146', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\113', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\153', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\112', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\165', '\111', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\101', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\146', '\110', '\040', '\160', '\162', '\040', '\061', + '\012', '\121', '\167', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\167', '\142', '\125', '\040', '\167', '\141', '\040', '\061', + '\012', '\166', '\104', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\112', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\154', '\122', '\040', '\154', '\145', '\040', '\061', + '\012', '\155', '\130', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\162', '\110', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\157', '\126', '\172', '\040', '\157', '\156', '\040', '\061', + '\012', '\147', '\164', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\162', '\113', '\040', '\110', '\113', '\040', '\061', + '\012', '\127', '\170', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\160', '\156', '\112', '\040', '\141', '\156', '\040', '\061', + '\012', '\106', '\161', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\126', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\143', '\142', '\120', '\040', '\143', '\150', '\040', '\061', + '\012', '\107', '\152', '\143', '\040', '\152', '\123', '\040', '\061', + '\012', '\152', '\121', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\164', '\166', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\172', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\171', '\127', '\040', '\151', '\152', '\040', '\061', + '\012', '\130', '\142', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\161', '\146', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\166', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\142', '\114', '\040', '\167', '\141', '\040', '\061', + '\012', '\155', '\153', '\117', '\040', '\153', '\141', '\040', '\061', + '\012', '\145', '\161', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\166', '\123', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\107', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\127', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\154', '\130', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\112', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\114', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\116', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\153', '\172', '\121', '\040', '\163', '\172', '\040', '\061', + '\012', '\103', '\172', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\153', '\156', '\126', '\040', '\141', '\156', '\040', '\061', + '\012', '\122', '\152', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\116', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\120', '\155', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\170', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\150', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\125', '\166', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\146', '\125', '\040', '\146', '\157', '\040', '\061', + '\012', '\151', '\116', '\160', '\040', '\151', '\156', '\040', '\061', + '\012', '\171', '\131', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\157', '\120', '\142', '\040', '\157', '\156', '\040', '\061', + '\012', '\161', '\151', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\143', '\104', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\126', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\107', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\122', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\142', '\102', '\040', '\142', '\145', '\040', '\061', + '\012', '\163', '\132', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\147', '\170', '\117', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\106', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\115', '\170', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\170', '\120', '\040', '\144', '\145', '\040', '\061', + '\012', '\154', '\122', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\142', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\105', '\141', '\157', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\147', '\101', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\143', '\127', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\155', '\121', '\040', '\166', '\141', '\040', '\061', + '\012', '\131', '\161', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\151', '\117', '\040', '\151', '\156', '\040', '\061', + '\012', '\170', '\117', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\110', '\146', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\142', '\146', '\123', '\040', '\142', '\145', '\040', '\061', + '\012', '\121', '\150', '\156', '\040', '\164', '\150', '\040', '\061', + '\012', '\103', '\155', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\154', '\131', '\163', '\040', '\154', '\145', '\040', '\061', + '\012', '\116', '\161', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\145', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\164', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\115', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\165', '\150', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\123', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\144', '\131', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\146', '\127', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\123', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\123', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\103', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\160', '\167', '\103', '\040', '\160', '\162', '\040', '\061', + '\012', '\107', '\170', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\115', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\153', '\103', '\040', '\153', '\141', '\040', '\061', + '\012', '\165', '\161', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\102', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\163', '\127', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\132', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\170', '\152', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\110', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\167', '\116', '\040', '\167', '\141', '\040', '\061', + '\012', '\166', '\115', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\110', '\150', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\163', '\112', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\162', '\112', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\166', '\115', '\040', '\166', '\141', '\040', '\061', + '\012', '\155', '\130', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\127', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\144', '\170', '\132', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\126', '\152', '\040', '\163', '\164', '\040', '\061', + '\012', '\170', '\162', '\106', '\040', '\145', '\162', '\040', '\061', + '\012', '\160', '\142', '\125', '\040', '\160', '\162', '\040', '\061', + '\012', '\124', '\146', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\161', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\143', '\106', '\040', '\143', '\150', '\040', '\061', + '\012', '\156', '\162', '\123', '\040', '\141', '\156', '\040', '\061', + '\012', '\127', '\150', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\147', '\130', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\130', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\153', '\112', '\142', '\040', '\153', '\141', '\040', '\061', + '\012', '\162', '\132', '\153', '\040', '\145', '\162', '\040', '\061', + '\012', '\160', '\102', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\125', '\166', '\040', '\156', '\147', '\040', '\061', + '\012', '\110', '\161', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\113', '\161', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\106', '\152', '\040', '\157', '\156', '\040', '\061', + '\012', '\170', '\142', '\116', '\040', '\142', '\145', '\040', '\061', + '\012', '\160', '\156', '\113', '\040', '\141', '\156', '\040', '\061', + '\012', '\114', '\142', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\144', '\115', '\142', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\123', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\163', '\166', '\040', '\163', '\164', '\040', '\061', + '\012', '\167', '\162', '\126', '\040', '\145', '\162', '\040', '\061', + '\012', '\165', '\113', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\154', '\131', '\040', '\154', '\145', '\040', '\061', + '\012', '\147', '\170', '\106', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\152', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\162', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\162', '\166', '\106', '\040', '\145', '\162', '\040', '\061', + '\012', '\155', '\114', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\162', '\113', '\040', '\145', '\162', '\040', '\061', + '\012', '\121', '\154', '\172', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\170', '\104', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\144', '\131', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\166', '\104', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\121', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\106', '\165', '\040', '\165', '\156', '\040', '\061', + '\012', '\163', '\146', '\112', '\040', '\163', '\164', '\040', '\061', + '\012', '\160', '\111', '\146', '\040', '\160', '\162', '\040', '\061', + '\012', '\150', '\170', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\116', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\111', '\144', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\110', '\146', '\040', '\156', '\171', '\040', '\061', + '\012', '\161', '\130', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\154', '\104', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\106', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\127', '\160', '\040', '\151', '\152', '\040', '\061', + '\012', '\145', '\113', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\150', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\142', '\126', '\040', '\142', '\145', '\040', '\061', + '\012', '\170', '\130', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\131', '\150', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\167', '\130', '\040', '\167', '\141', '\040', '\061', + '\012', '\142', '\161', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\166', '\131', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\166', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\162', '\142', '\120', '\040', '\145', '\162', '\040', '\061', + '\012', '\163', '\130', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\125', '\167', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\155', '\127', '\040', '\155', '\145', '\040', '\061', + '\012', '\160', '\170', '\126', '\040', '\160', '\162', '\040', '\061', + '\012', '\156', '\152', '\132', '\040', '\141', '\156', '\040', '\061', + '\012', '\124', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\155', '\105', '\040', '\163', '\172', '\040', '\061', + '\012', '\122', '\161', '\165', '\040', '\165', '\156', '\040', '\061', + '\012', '\161', '\161', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\150', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\112', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\161', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\103', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\160', '\127', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\144', '\171', '\040', '\144', '\145', '\040', '\061', + '\012', '\151', '\122', '\170', '\040', '\151', '\156', '\040', '\061', + '\012', '\126', '\143', '\155', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\111', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\130', '\142', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\143', '\107', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\152', '\130', '\040', '\151', '\152', '\040', '\061', + '\012', '\156', '\155', '\117', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\121', '\152', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\146', '\126', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\142', '\113', '\040', '\144', '\145', '\040', '\061', + '\012', '\147', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\106', '\144', '\040', '\141', '\156', '\040', '\061', + '\012', '\157', '\127', '\166', '\040', '\157', '\156', '\040', '\061', + '\012', '\156', '\110', '\160', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\156', '\113', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\170', '\132', '\040', '\142', '\145', '\040', '\061', + '\012', '\167', '\155', '\110', '\040', '\155', '\145', '\040', '\061', + '\012', '\146', '\147', '\130', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\172', '\110', '\040', '\156', '\147', '\040', '\061', + '\012', '\132', '\142', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\147', '\115', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\155', '\113', '\040', '\144', '\145', '\040', '\061', + '\012', '\143', '\166', '\102', '\040', '\143', '\150', '\040', '\061', + '\012', '\145', '\121', '\163', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\110', '\155', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\102', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\110', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\166', '\161', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\116', '\160', '\171', '\040', '\160', '\162', '\040', '\061', + '\012', '\170', '\172', '\114', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\115', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\167', '\125', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\146', '\130', '\040', '\160', '\162', '\040', '\061', + '\012', '\156', '\106', '\147', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\106', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\126', '\161', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\105', '\155', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\130', '\171', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\126', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\166', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\110', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\127', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\170', '\143', '\113', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\125', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\114', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\165', '\126', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\106', '\163', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\107', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\167', '\171', '\040', '\167', '\141', '\040', '\061', + '\012', '\147', '\172', '\124', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\116', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\162', '\125', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\164', '\101', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\161', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\167', '\115', '\040', '\160', '\162', '\040', '\061', + '\012', '\154', '\162', '\120', '\040', '\145', '\162', '\040', '\061', + '\012', '\152', '\155', '\103', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\155', '\120', '\040', '\155', '\145', '\040', '\061', + '\012', '\171', '\151', '\131', '\040', '\151', '\156', '\040', '\061', + '\012', '\160', '\124', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\132', '\167', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\160', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\150', '\112', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\117', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\143', '\113', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\125', '\147', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\146', '\106', '\040', '\146', '\157', '\040', '\061', + '\012', '\143', '\124', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\160', '\130', '\040', '\156', '\147', '\040', '\061', + '\012', '\114', '\146', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\147', '\167', '\125', '\040', '\156', '\147', '\040', '\061', + '\012', '\104', '\172', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\153', '\104', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\120', '\166', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\144', '\131', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\127', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\163', '\121', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\152', '\131', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\103', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\162', '\123', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\123', '\146', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\132', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\115', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\116', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\152', '\124', '\166', '\040', '\151', '\152', '\040', '\061', + '\012', '\164', '\155', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\170', '\112', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\101', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\110', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\146', '\147', '\101', '\040', '\156', '\147', '\040', '\061', + '\012', '\122', '\150', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\127', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\146', '\125', '\040', '\160', '\162', '\040', '\061', + '\012', '\157', '\111', '\152', '\040', '\157', '\156', '\040', '\061', + '\012', '\154', '\150', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\104', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\166', '\112', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\104', '\160', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\151', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\146', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\170', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\106', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\150', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\152', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\164', '\155', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\155', '\115', '\040', '\155', '\145', '\040', '\061', + '\012', '\143', '\126', '\171', '\040', '\143', '\150', '\040', '\061', + '\012', '\113', '\172', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\146', '\101', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\152', '\122', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\171', '\121', '\040', '\156', '\171', '\040', '\061', + '\012', '\155', '\102', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\121', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\144', '\132', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\145', '\126', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\116', '\166', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\106', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\150', '\154', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\143', '\156', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\167', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\132', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\150', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\127', '\146', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\112', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\131', '\172', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\105', '\157', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\116', '\152', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\132', '\147', '\144', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\107', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\147', '\131', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\171', '\105', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\172', '\105', '\040', '\163', '\172', '\040', '\061', + '\012', '\165', '\152', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\142', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\163', '\146', '\040', '\163', '\164', '\040', '\061', + '\012', '\155', '\121', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\121', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\171', '\130', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\131', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\145', '\120', '\166', '\040', '\145', '\162', '\040', '\061', + '\012', '\141', '\103', '\166', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\126', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\172', '\170', '\117', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\152', '\127', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\147', '\111', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\132', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\164', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\115', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\124', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\115', '\170', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\142', '\111', '\040', '\142', '\145', '\040', '\061', + '\012', '\161', '\101', '\165', '\040', '\165', '\156', '\040', '\061', + '\012', '\167', '\146', '\124', '\040', '\167', '\141', '\040', '\061', + '\012', '\146', '\143', '\106', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\146', '\113', '\040', '\160', '\162', '\040', '\061', + '\012', '\142', '\117', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\165', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\112', '\155', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\160', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\161', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\117', '\166', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\130', '\154', '\152', '\040', '\154', '\145', '\040', '\061', + '\012', '\116', '\162', '\154', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\170', '\127', '\040', '\146', '\157', '\040', '\061', + '\012', '\123', '\167', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\166', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\160', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\116', '\167', '\040', '\157', '\156', '\040', '\061', + '\012', '\153', '\131', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\130', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\121', '\146', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\145', '\104', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\126', '\161', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\113', '\172', '\040', '\165', '\163', '\040', '\061', + '\012', '\161', '\152', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\125', '\170', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\114', '\153', '\171', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\106', '\171', '\040', '\163', '\172', '\040', '\061', + '\012', '\156', '\115', '\154', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\131', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\143', '\121', '\145', '\040', '\143', '\150', '\040', '\061', + '\012', '\157', '\131', '\152', '\040', '\157', '\156', '\040', '\061', + '\012', '\164', '\142', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\131', '\142', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\156', '\126', '\153', '\040', '\156', '\144', '\040', '\061', + '\012', '\142', '\130', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\114', '\161', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\144', '\113', '\040', '\144', '\145', '\040', '\061', + '\012', '\160', '\144', '\120', '\040', '\144', '\145', '\040', '\061', + '\012', '\164', '\161', '\123', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\152', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\143', '\103', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\132', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\141', '\123', '\144', '\040', '\141', '\156', '\040', '\061', + '\012', '\103', '\155', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\172', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\121', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\107', '\161', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\127', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\130', '\162', '\167', '\040', '\145', '\162', '\040', '\061', + '\012', '\171', '\112', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\163', '\161', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\127', '\142', '\040', '\144', '\145', '\040', '\061', + '\012', '\156', '\142', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\151', '\167', '\120', '\040', '\151', '\156', '\040', '\061', + '\012', '\154', '\127', '\163', '\040', '\154', '\145', '\040', '\061', + '\012', '\124', '\163', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\110', '\172', '\040', '\144', '\145', '\040', '\061', + '\012', '\164', '\143', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\153', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\102', '\144', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\115', '\170', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\152', '\126', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\121', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\144', '\156', '\111', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\171', '\131', '\040', '\156', '\171', '\040', '\061', + '\012', '\141', '\106', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\131', '\154', '\170', '\040', '\154', '\145', '\040', '\061', + '\012', '\131', '\171', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\152', '\142', '\126', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\143', '\126', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\172', '\130', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\122', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\152', '\101', '\040', '\144', '\145', '\040', '\061', + '\012', '\142', '\156', '\111', '\040', '\141', '\156', '\040', '\061', + '\012', '\114', '\154', '\166', '\040', '\154', '\145', '\040', '\061', + '\012', '\164', '\155', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\121', '\157', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\164', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\122', '\170', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\170', '\127', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\164', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\161', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\110', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\122', '\152', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\116', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\107', '\151', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\131', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\131', '\144', '\160', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\127', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\153', '\102', '\040', '\153', '\141', '\040', '\061', + '\012', '\153', '\170', '\103', '\040', '\153', '\141', '\040', '\061', + '\012', '\154', '\152', '\101', '\040', '\154', '\145', '\040', '\061', + '\012', '\121', '\167', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\155', '\103', '\160', '\040', '\155', '\145', '\040', '\061', + '\012', '\146', '\112', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\103', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\143', '\172', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\102', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\143', '\131', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\110', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\153', '\166', '\127', '\040', '\153', '\141', '\040', '\061', + '\012', '\112', '\155', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\121', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\142', '\121', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\170', '\130', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\106', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\124', '\152', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\170', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\144', '\131', '\040', '\144', '\145', '\040', '\061', + '\012', '\160', '\155', '\106', '\040', '\155', '\145', '\040', '\061', + '\012', '\163', '\104', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\162', '\126', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\104', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\102', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\110', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\172', '\121', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\126', '\160', '\040', '\154', '\145', '\040', '\061', + '\012', '\147', '\146', '\110', '\040', '\156', '\147', '\040', '\061', + '\012', '\157', '\107', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\166', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\115', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\156', '\123', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\121', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\165', '\157', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\153', '\130', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\110', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\165', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\142', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\167', '\107', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\160', '\130', '\040', '\143', '\150', '\040', '\061', + '\012', '\122', '\160', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\113', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\125', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\156', '\112', '\040', '\141', '\156', '\040', '\061', + '\012', '\122', '\160', '\171', '\040', '\160', '\162', '\040', '\061', + '\012', '\142', '\143', '\123', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\170', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\152', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\121', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\162', '\130', '\040', '\145', '\162', '\040', '\061', + '\012', '\106', '\143', '\147', '\040', '\143', '\150', '\040', '\061', + '\012', '\157', '\126', '\170', '\040', '\157', '\156', '\040', '\061', + '\012', '\166', '\112', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\102', '\166', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\144', '\155', '\130', '\040', '\144', '\145', '\040', '\061', + '\012', '\127', '\144', '\152', '\040', '\144', '\145', '\040', '\061', + '\012', '\131', '\172', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\131', '\143', '\144', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\113', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\162', '\110', '\040', '\145', '\162', '\040', '\061', + '\012', '\114', '\156', '\155', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\103', '\155', '\040', '\163', '\172', '\040', '\061', + '\012', '\125', '\167', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\125', '\166', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\115', '\146', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\161', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\146', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\110', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\153', '\147', '\112', '\040', '\156', '\147', '\040', '\061', + '\012', '\141', '\107', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\152', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\153', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\110', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\116', '\172', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\132', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\166', '\113', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\154', '\106', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\155', '\104', '\040', '\155', '\145', '\040', '\061', + '\012', '\131', '\160', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\106', '\171', '\040', '\160', '\162', '\040', '\061', + '\012', '\150', '\166', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\164', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\161', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\166', '\116', '\040', '\153', '\141', '\040', '\061', + '\012', '\164', '\143', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\153', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\144', '\110', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\105', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\143', '\167', '\040', '\143', '\150', '\040', '\061', + '\012', '\126', '\167', '\165', '\040', '\165', '\156', '\040', '\061', + '\012', '\147', '\130', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\127', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\127', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\112', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\123', '\152', '\040', '\157', '\156', '\040', '\061', + '\012', '\154', '\167', '\131', '\040', '\154', '\145', '\040', '\061', + '\012', '\124', '\153', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\160', '\143', '\103', '\040', '\143', '\150', '\040', '\061', + '\012', '\157', '\150', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\172', '\107', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\144', '\116', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\162', '\123', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\110', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\152', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\142', '\132', '\040', '\166', '\141', '\040', '\061', + '\012', '\125', '\144', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\172', '\130', '\040', '\163', '\172', '\040', '\061', + '\012', '\165', '\116', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\146', '\132', '\040', '\167', '\141', '\040', '\061', + '\012', '\163', '\167', '\102', '\040', '\163', '\164', '\040', '\061', + '\012', '\144', '\155', '\121', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\143', '\101', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\172', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\112', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\127', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\126', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\167', '\102', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\111', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\142', '\160', '\125', '\040', '\160', '\162', '\040', '\061', + '\012', '\142', '\167', '\115', '\040', '\167', '\141', '\040', '\061', + '\012', '\146', '\153', '\101', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\125', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\124', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\113', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\154', '\170', '\123', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\141', '\123', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\166', '\121', '\040', '\166', '\141', '\040', '\061', + '\012', '\144', '\150', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\144', '\127', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\146', '\112', '\040', '\167', '\141', '\040', '\061', + '\012', '\127', '\161', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\132', '\152', '\040', '\163', '\164', '\040', '\061', + '\012', '\114', '\170', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\170', '\130', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\161', '\104', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\113', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\166', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\146', '\110', '\040', '\153', '\141', '\040', '\061', + '\012', '\141', '\121', '\160', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\106', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\156', '\152', '\127', '\040', '\141', '\156', '\040', '\061', + '\012', '\122', '\160', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\115', '\155', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\150', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\113', '\153', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\101', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\146', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\167', '\116', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\160', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\170', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\107', '\144', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\115', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\167', '\114', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\102', '\142', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\101', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\123', '\144', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\112', '\155', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\142', '\147', '\130', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\127', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\150', '\110', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\107', '\167', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\106', '\142', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\172', '\157', '\124', '\040', '\157', '\156', '\040', '\061', + '\012', '\171', '\152', '\107', '\040', '\151', '\152', '\040', '\061', + '\012', '\122', '\154', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\106', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\143', '\113', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\144', '\103', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\166', '\117', '\040', '\166', '\141', '\040', '\061', + '\012', '\157', '\121', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\156', '\111', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\172', '\101', '\040', '\163', '\172', '\040', '\061', + '\012', '\122', '\172', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\121', '\172', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\131', '\152', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\153', '\121', '\040', '\153', '\165', '\040', '\061', + '\012', '\154', '\162', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\167', '\132', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\107', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\155', '\156', '\114', '\040', '\141', '\156', '\040', '\061', + '\012', '\122', '\154', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\143', '\104', '\040', '\143', '\150', '\040', '\061', + '\012', '\162', '\122', '\144', '\040', '\145', '\162', '\040', '\061', + '\012', '\117', '\146', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\106', '\152', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\165', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\132', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\116', '\142', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\156', '\127', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\142', '\110', '\040', '\151', '\152', '\040', '\061', + '\012', '\162', '\104', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\121', '\155', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\167', '\126', '\040', '\144', '\145', '\040', '\061', + '\012', '\117', '\161', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\161', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\167', '\111', '\040', '\167', '\141', '\040', '\061', + '\012', '\156', '\152', '\120', '\040', '\141', '\156', '\040', '\061', + '\012', '\117', '\161', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\126', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\146', '\117', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\161', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\104', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\124', '\155', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\143', '\113', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\155', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\126', '\170', '\040', '\163', '\164', '\040', '\061', + '\012', '\127', '\146', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\112', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\165', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\146', '\116', '\040', '\142', '\145', '\040', '\061', + '\012', '\161', '\146', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\106', '\155', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\164', '\142', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\152', '\116', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\150', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\116', '\170', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\167', '\170', '\125', '\040', '\167', '\141', '\040', '\061', + '\012', '\172', '\130', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\116', '\172', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\157', '\150', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\126', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\163', '\170', '\040', '\163', '\164', '\040', '\061', + '\012', '\132', '\161', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\125', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\152', '\103', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\124', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\161', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\106', '\171', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\111', '\143', '\144', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\166', '\116', '\040', '\163', '\164', '\040', '\061', + '\012', '\112', '\152', '\166', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\126', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\146', '\144', '\111', '\040', '\144', '\145', '\040', '\061', + '\012', '\156', '\142', '\130', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\146', '\125', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\107', '\155', '\040', '\154', '\145', '\040', '\061', + '\012', '\117', '\166', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\104', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\147', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\131', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\152', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\120', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\151', '\122', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\162', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\160', '\124', '\040', '\160', '\162', '\040', '\061', + '\012', '\170', '\163', '\102', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\170', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\106', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\157', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\155', '\104', '\040', '\163', '\164', '\040', '\061', + '\012', '\154', '\142', '\115', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\103', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\106', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\130', '\154', '\166', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\171', '\125', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\106', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\164', '\152', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\131', '\170', '\040', '\151', '\156', '\040', '\061', + '\012', '\165', '\112', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\145', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\162', '\166', '\040', '\145', '\162', '\040', '\061', + '\012', '\102', '\161', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\144', '\142', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\156', '\122', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\155', '\114', '\040', '\155', '\145', '\040', '\061', + '\012', '\164', '\166', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\124', '\155', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\104', '\147', '\142', '\040', '\156', '\147', '\040', '\061', + '\012', '\157', '\172', '\117', '\040', '\157', '\156', '\040', '\061', + '\012', '\146', '\121', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\120', '\161', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\131', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\120', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\147', '\127', '\146', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\103', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\145', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\132', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\147', '\132', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\152', '\117', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\103', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\166', '\121', '\040', '\163', '\164', '\040', '\061', + '\012', '\122', '\161', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\142', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\114', '\153', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\106', '\172', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\154', '\102', '\040', '\154', '\145', '\040', '\061', + '\012', '\151', '\127', '\152', '\040', '\151', '\156', '\040', '\061', + '\012', '\132', '\170', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\113', '\170', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\152', '\143', '\112', '\040', '\151', '\152', '\040', '\061', + '\012', '\165', '\103', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\101', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\126', '\152', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\125', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\115', '\156', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\152', '\115', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\125', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\165', '\132', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\167', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\131', '\164', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\122', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\172', '\126', '\040', '\163', '\172', '\040', '\061', + '\012', '\155', '\166', '\131', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\106', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\102', '\160', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\107', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\125', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\147', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\127', '\142', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\167', '\120', '\040', '\167', '\141', '\040', '\061', + '\012', '\167', '\166', '\105', '\040', '\166', '\141', '\040', '\061', + '\012', '\106', '\163', '\170', '\040', '\163', '\164', '\040', '\061', + '\012', '\111', '\172', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\167', '\103', '\040', '\167', '\141', '\040', '\061', + '\012', '\106', '\155', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\114', '\144', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\122', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\151', '\130', '\146', '\040', '\151', '\156', '\040', '\061', + '\012', '\171', '\115', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\161', '\120', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\163', '\114', '\040', '\163', '\164', '\040', '\061', + '\012', '\152', '\111', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\165', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\142', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\105', '\161', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\117', '\147', '\146', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\107', '\166', '\040', '\153', '\141', '\040', '\061', + '\012', '\160', '\152', '\113', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\143', '\121', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\172', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\125', '\166', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\107', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\150', '\155', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\161', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\153', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\147', '\130', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\167', '\117', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\155', '\123', '\040', '\155', '\145', '\040', '\061', + '\012', '\166', '\150', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\171', '\130', '\040', '\163', '\164', '\040', '\061', + '\012', '\156', '\142', '\103', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\147', '\127', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\161', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\127', '\146', '\040', '\144', '\145', '\040', '\061', + '\012', '\143', '\167', '\106', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\156', '\106', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\104', '\151', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\123', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\121', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\162', '\132', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\107', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\170', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\162', '\127', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\154', '\130', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\106', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\160', '\142', '\106', '\040', '\160', '\162', '\040', '\061', + '\012', '\142', '\116', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\121', '\143', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\126', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\160', '\120', '\146', '\040', '\160', '\162', '\040', '\061', + '\012', '\160', '\126', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\154', '\107', '\040', '\154', '\145', '\040', '\061', + '\012', '\104', '\167', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\121', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\154', '\153', '\121', '\040', '\154', '\145', '\040', '\061', + '\012', '\163', '\161', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\171', '\170', '\040', '\156', '\171', '\040', '\061', + '\012', '\166', '\106', '\155', '\040', '\166', '\141', '\040', '\061', + '\012', '\164', '\121', '\157', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\154', '\125', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\154', '\127', '\040', '\154', '\145', '\040', '\061', + '\012', '\147', '\154', '\127', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\155', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\141', '\127', '\154', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\155', '\126', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\114', '\155', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\154', '\102', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\161', '\101', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\147', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\107', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\167', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\106', '\146', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\167', '\155', '\114', '\040', '\155', '\145', '\040', '\061', + '\012', '\170', '\114', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\142', '\105', '\040', '\163', '\164', '\040', '\061', + '\012', '\142', '\121', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\153', '\122', '\040', '\153', '\141', '\040', '\061', + '\012', '\171', '\106', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\117', '\155', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\146', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\112', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\114', '\167', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\167', '\146', '\125', '\040', '\167', '\141', '\040', '\061', + '\012', '\172', '\146', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\116', '\166', '\040', '\154', '\145', '\040', '\061', + '\012', '\171', '\153', '\121', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\104', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\104', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\142', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\121', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\166', '\166', '\115', '\040', '\166', '\141', '\040', '\061', + '\012', '\130', '\161', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\114', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\153', '\132', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\101', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\152', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\106', '\167', '\040', '\143', '\150', '\040', '\061', + '\012', '\162', '\167', '\121', '\040', '\145', '\162', '\040', '\061', + '\012', '\155', '\127', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\131', '\162', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\145', '\125', '\157', '\040', '\145', '\162', '\040', '\061', + '\012', '\165', '\104', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\115', '\150', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\107', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\122', '\160', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\163', '\142', '\106', '\040', '\163', '\164', '\040', '\061', + '\012', '\156', '\146', '\130', '\040', '\141', '\156', '\040', '\061', + '\012', '\127', '\146', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\115', '\167', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\104', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\160', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\172', '\106', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\130', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\163', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\132', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\114', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\161', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\152', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\153', '\104', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\112', '\170', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\126', '\161', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\110', '\166', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\161', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\122', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\166', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\116', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\127', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\122', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\162', '\107', '\142', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\132', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\130', '\164', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\132', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\126', '\155', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\144', '\115', '\160', '\040', '\144', '\145', '\040', '\061', + '\012', '\143', '\120', '\171', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\172', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\152', '\105', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\172', '\106', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\103', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\146', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\143', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\132', '\146', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\167', '\103', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\153', '\115', '\040', '\153', '\157', '\040', '\061', + '\012', '\166', '\112', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\145', '\103', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\120', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\161', '\112', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\155', '\131', '\040', '\144', '\145', '\040', '\061', + '\012', '\165', '\115', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\113', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\161', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\116', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\103', '\162', '\152', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\163', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\167', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\123', '\144', '\171', '\040', '\144', '\145', '\040', '\061', + '\012', '\106', '\160', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\127', '\143', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\152', '\127', '\040', '\151', '\152', '\040', '\061', + '\012', '\144', '\167', '\127', '\040', '\144', '\145', '\040', '\061', + '\012', '\147', '\152', '\130', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\132', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\143', '\113', '\147', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\144', '\122', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\161', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\150', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\147', '\107', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\115', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\156', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\112', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\166', '\103', '\040', '\166', '\141', '\040', '\061', + '\012', '\143', '\160', '\122', '\040', '\143', '\150', '\040', '\061', + '\012', '\127', '\164', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\171', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\130', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\113', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\126', '\166', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\172', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\120', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\124', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\106', '\152', '\040', '\163', '\164', '\040', '\061', + '\012', '\155', '\172', '\130', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\115', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\170', '\111', '\040', '\145', '\162', '\040', '\061', + '\012', '\145', '\131', '\146', '\040', '\145', '\162', '\040', '\061', + '\012', '\153', '\167', '\102', '\040', '\153', '\141', '\040', '\061', + '\012', '\145', '\121', '\153', '\040', '\145', '\162', '\040', '\061', + '\012', '\152', '\102', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\142', '\110', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\103', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\156', '\166', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\131', '\144', '\040', '\156', '\147', '\040', '\061', + '\012', '\132', '\170', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\132', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\110', '\147', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\122', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\160', '\122', '\040', '\160', '\162', '\040', '\061', + '\012', '\143', '\142', '\122', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\161', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\115', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\121', '\171', '\040', '\164', '\157', '\040', '\061', + '\012', '\166', '\170', '\107', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\160', '\102', '\040', '\156', '\147', '\040', '\061', + '\012', '\107', '\153', '\167', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\161', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\120', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\156', '\116', '\040', '\141', '\156', '\040', '\061', + '\012', '\107', '\153', '\160', '\040', '\153', '\141', '\040', '\061', + '\012', '\155', '\166', '\121', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\110', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\146', '\123', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\103', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\161', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\147', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\115', '\167', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\161', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\106', '\153', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\157', '\106', '\166', '\040', '\157', '\156', '\040', '\061', + '\012', '\104', '\144', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\111', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\146', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\147', '\121', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\170', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\161', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\110', '\164', '\156', '\040', '\164', '\150', '\040', '\061', + '\012', '\107', '\166', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\122', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\103', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\162', '\152', '\124', '\040', '\162', '\157', '\040', '\061', + '\012', '\162', '\152', '\104', '\040', '\145', '\162', '\040', '\061', + '\012', '\121', '\160', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\130', '\144', '\142', '\040', '\144', '\145', '\040', '\061', + '\012', '\114', '\153', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\101', '\152', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\131', '\154', '\172', '\040', '\154', '\145', '\040', '\061', + '\012', '\121', '\164', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\110', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\104', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\114', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\150', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\114', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\147', '\113', '\040', '\156', '\147', '\040', '\061', + '\012', '\145', '\127', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\152', '\123', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\126', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\117', '\153', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\105', '\167', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\104', '\163', '\166', '\040', '\163', '\164', '\040', '\061', + '\012', '\152', '\150', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\107', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\117', '\153', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\106', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\120', '\166', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\163', '\113', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\114', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\153', '\102', '\040', '\153', '\141', '\040', '\061', + '\012', '\143', '\103', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\116', '\160', '\040', '\156', '\147', '\040', '\061', + '\012', '\121', '\167', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\124', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\120', '\161', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\106', '\166', '\040', '\162', '\157', '\040', '\061', + '\012', '\122', '\167', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\113', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\161', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\155', '\113', '\040', '\153', '\141', '\040', '\061', + '\012', '\167', '\165', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\156', '\132', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\147', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\144', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\101', '\170', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\167', '\117', '\040', '\167', '\141', '\040', '\061', + '\012', '\145', '\121', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\106', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\104', '\160', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\160', '\121', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\141', '\106', '\160', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\146', '\102', '\040', '\155', '\145', '\040', '\061', + '\012', '\146', '\160', '\101', '\040', '\160', '\162', '\040', '\061', + '\012', '\152', '\147', '\132', '\040', '\156', '\147', '\040', '\061', + '\012', '\154', '\107', '\153', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\143', '\101', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\127', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\154', '\172', '\106', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\163', '\121', '\040', '\163', '\164', '\040', '\061', + '\012', '\142', '\121', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\167', '\152', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\104', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\127', '\160', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\162', '\146', '\126', '\040', '\145', '\162', '\040', '\061', + '\012', '\132', '\142', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\150', '\113', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\130', '\141', '\040', '\141', '\162', '\040', '\061', + '\012', '\167', '\152', '\101', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\172', '\123', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\127', '\171', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\152', '\113', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\122', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\161', '\147', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\161', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\156', '\125', '\040', '\141', '\156', '\040', '\061', + '\012', '\132', '\161', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\161', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\114', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\172', '\126', '\040', '\156', '\147', '\040', '\061', + '\012', '\113', '\161', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\147', '\132', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\161', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\161', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\111', '\145', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\152', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\155', '\116', '\040', '\166', '\141', '\040', '\061', + '\012', '\151', '\165', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\107', '\171', '\040', '\167', '\141', '\040', '\061', + '\012', '\113', '\144', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\121', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\127', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\103', '\170', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\113', '\161', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\130', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\157', '\121', '\040', '\157', '\156', '\040', '\061', + '\012', '\167', '\102', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\171', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\150', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\160', '\171', '\040', '\160', '\162', '\040', '\061', + '\012', '\156', '\112', '\142', '\040', '\141', '\156', '\040', '\061', + '\012', '\165', '\107', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\150', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\152', '\123', '\040', '\151', '\152', '\040', '\061', + '\012', '\123', '\143', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\106', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\113', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\130', '\155', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\144', '\124', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\112', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\124', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\152', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\115', '\161', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\110', '\160', '\040', '\144', '\145', '\040', '\061', + '\012', '\162', '\122', '\156', '\040', '\141', '\162', '\040', '\061', + '\012', '\130', '\154', '\146', '\040', '\154', '\145', '\040', '\061', + '\012', '\143', '\116', '\163', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\161', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\151', '\106', '\172', '\040', '\151', '\156', '\040', '\061', + '\012', '\116', '\154', '\153', '\040', '\154', '\145', '\040', '\061', + '\012', '\163', '\120', '\167', '\040', '\163', '\164', '\040', '\061', + '\012', '\166', '\127', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\130', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\156', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\157', '\172', '\112', '\040', '\157', '\156', '\040', '\061', + '\012', '\172', '\111', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\154', '\123', '\146', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\122', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\102', '\166', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\127', '\167', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\160', '\127', '\147', '\040', '\160', '\162', '\040', '\061', + '\012', '\160', '\114', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\153', '\162', '\112', '\040', '\145', '\162', '\040', '\061', + '\012', '\132', '\146', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\171', '\111', '\170', '\040', '\156', '\171', '\040', '\061', + '\012', '\157', '\113', '\170', '\040', '\157', '\156', '\040', '\061', + '\012', '\161', '\114', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\110', '\152', '\040', '\144', '\145', '\040', '\061', + '\012', '\157', '\161', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\170', '\103', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\112', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\132', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\143', '\127', '\172', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\161', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\130', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\131', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\107', '\171', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\104', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\113', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\130', '\152', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\152', '\115', '\040', '\163', '\164', '\040', '\061', + '\012', '\163', '\146', '\103', '\040', '\163', '\164', '\040', '\061', + '\012', '\144', '\115', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\132', '\160', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\143', '\104', '\040', '\143', '\150', '\040', '\061', + '\012', '\121', '\157', '\152', '\040', '\157', '\156', '\040', '\061', + '\012', '\147', '\170', '\103', '\040', '\156', '\147', '\040', '\061', + '\012', '\132', '\146', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\131', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\127', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\132', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\121', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\130', '\154', '\142', '\040', '\154', '\145', '\040', '\061', + '\012', '\147', '\121', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\156', '\142', '\132', '\040', '\141', '\156', '\040', '\061', + '\012', '\105', '\172', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\116', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\130', '\162', '\152', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\170', '\130', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\121', '\160', '\040', '\144', '\145', '\040', '\061', + '\012', '\131', '\160', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\116', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\160', '\142', '\121', '\040', '\160', '\162', '\040', '\061', + '\012', '\147', '\115', '\166', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\145', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\126', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\126', '\153', '\040', '\144', '\145', '\040', '\061', + '\012', '\165', '\115', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\121', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\150', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\124', '\142', '\040', '\151', '\156', '\040', '\061', + '\012', '\120', '\166', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\103', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\143', '\122', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\166', '\125', '\040', '\163', '\164', '\040', '\061', + '\012', '\156', '\115', '\172', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\152', '\105', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\155', '\110', '\040', '\151', '\152', '\040', '\061', + '\012', '\121', '\172', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\161', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\154', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\166', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\110', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\147', '\161', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\163', '\116', '\040', '\163', '\164', '\040', '\061', + '\012', '\153', '\103', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\117', '\154', '\170', '\040', '\154', '\145', '\040', '\061', + '\012', '\107', '\170', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\170', '\167', '\126', '\040', '\167', '\141', '\040', '\061', + '\012', '\146', '\120', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\122', '\150', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\147', '\126', '\040', '\156', '\147', '\040', '\061', + '\012', '\121', '\144', '\160', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\106', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\153', '\154', '\121', '\040', '\154', '\145', '\040', '\061', + '\012', '\171', '\112', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\162', '\170', '\105', '\040', '\145', '\162', '\040', '\061', + '\012', '\165', '\110', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\113', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\160', '\112', '\040', '\160', '\162', '\040', '\061', + '\012', '\103', '\152', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\164', '\131', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\160', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\132', '\170', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\121', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\106', '\170', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\121', '\157', '\153', '\040', '\157', '\156', '\040', '\061', + '\012', '\160', '\154', '\113', '\040', '\154', '\145', '\040', '\061', + '\012', '\154', '\160', '\130', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\144', '\120', '\040', '\144', '\145', '\040', '\061', + '\012', '\132', '\161', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\122', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\156', '\104', '\147', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\161', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\147', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\115', '\142', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\113', '\161', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\116', '\161', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\172', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\163', '\107', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\104', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\112', '\152', '\153', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\164', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\167', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\104', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\147', '\146', '\107', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\150', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\125', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\127', '\142', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\153', '\106', '\040', '\153', '\157', '\040', '\061', + '\012', '\120', '\161', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\142', '\113', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\123', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\167', '\111', '\040', '\166', '\141', '\040', '\061', + '\012', '\143', '\106', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\146', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\150', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\172', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\144', '\116', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\167', '\122', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\172', '\113', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\121', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\114', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\125', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\162', '\110', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\165', '\112', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\106', '\150', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\116', '\172', '\155', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\122', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\130', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\124', '\172', '\155', '\040', '\163', '\172', '\040', '\061', + '\012', '\132', '\153', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\150', '\114', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\125', '\153', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\115', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\166', '\107', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\164', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\170', '\105', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\162', '\110', '\040', '\145', '\162', '\040', '\061', + '\012', '\106', '\147', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\154', '\106', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\143', '\117', '\040', '\152', '\141', '\040', '\061', + '\012', '\163', '\103', '\167', '\040', '\163', '\164', '\040', '\061', + '\012', '\102', '\161', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\132', '\171', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\117', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\112', '\142', '\040', '\145', '\162', '\040', '\061', + '\012', '\162', '\152', '\126', '\040', '\145', '\162', '\040', '\061', + '\012', '\113', '\167', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\110', '\143', '\167', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\103', '\167', '\040', '\155', '\141', '\040', '\061', + '\012', '\150', '\170', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\124', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\155', '\121', '\040', '\155', '\145', '\040', '\061', + '\012', '\160', '\152', '\122', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\144', '\120', '\040', '\143', '\150', '\040', '\061', + '\012', '\132', '\152', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\152', '\161', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\115', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\115', '\161', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\166', '\130', '\040', '\163', '\164', '\040', '\061', + '\012', '\151', '\130', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\156', '\167', '\122', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\164', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\152', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\103', '\152', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\160', '\130', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\107', '\167', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\111', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\121', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\131', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\166', '\164', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\125', '\163', '\170', '\040', '\163', '\164', '\040', '\061', + '\012', '\156', '\146', '\120', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\121', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\157', '\130', '\146', '\040', '\157', '\156', '\040', '\061', + '\012', '\146', '\105', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\163', '\147', '\130', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\120', '\160', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\142', '\127', '\040', '\142', '\145', '\040', '\061', + '\012', '\153', '\143', '\127', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\110', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\166', '\143', '\125', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\130', '\157', '\040', '\164', '\150', '\040', '\061', + '\012', '\113', '\172', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\103', '\146', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\125', '\152', '\171', '\040', '\151', '\152', '\040', '\061', + '\012', '\106', '\170', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\170', '\123', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\127', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\154', '\113', '\040', '\154', '\145', '\040', '\061', + '\012', '\156', '\132', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\117', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\153', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\172', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\165', '\124', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\162', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\120', '\164', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\104', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\162', '\116', '\155', '\040', '\145', '\162', '\040', '\061', + '\012', '\105', '\167', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\150', '\112', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\144', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\164', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\161', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\156', '\110', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\162', '\150', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\157', '\161', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\160', '\132', '\040', '\166', '\141', '\040', '\061', + '\012', '\104', '\147', '\144', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\170', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\103', '\170', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\154', '\126', '\040', '\160', '\162', '\040', '\061', + '\012', '\153', '\111', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\113', '\150', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\163', '\131', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\114', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\131', '\153', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\155', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\172', '\166', '\111', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\150', '\123', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\146', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\170', '\132', '\040', '\167', '\141', '\040', '\061', + '\012', '\152', '\126', '\171', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\121', '\167', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\130', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\114', '\150', '\163', '\040', '\164', '\150', '\040', '\061', + '\012', '\115', '\153', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\153', '\125', '\040', '\151', '\152', '\040', '\061', + '\012', '\131', '\150', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\162', '\110', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\150', '\107', '\040', '\166', '\141', '\040', '\061', + '\012', '\144', '\162', '\104', '\040', '\145', '\162', '\040', '\061', + '\012', '\120', '\163', '\152', '\040', '\163', '\164', '\040', '\061', + '\012', '\147', '\104', '\146', '\040', '\156', '\147', '\040', '\061', + '\012', '\130', '\152', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\114', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\153', '\154', '\103', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\124', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\162', '\112', '\040', '\145', '\162', '\040', '\061', + '\012', '\130', '\147', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\127', '\170', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\146', '\144', '\104', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\110', '\160', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\104', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\153', '\120', '\166', '\040', '\153', '\141', '\040', '\061', + '\012', '\122', '\153', '\155', '\040', '\153', '\141', '\040', '\061', + '\012', '\155', '\172', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\154', '\110', '\172', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\160', '\122', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\132', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\102', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\120', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\116', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\116', '\166', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\171', '\125', '\040', '\160', '\162', '\040', '\061', + '\012', '\123', '\152', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\113', '\172', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\157', '\121', '\160', '\040', '\157', '\156', '\040', '\061', + '\012', '\170', '\144', '\114', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\156', '\132', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\146', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\112', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\127', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\130', '\155', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\162', '\107', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\163', '\106', '\146', '\040', '\163', '\164', '\040', '\061', + '\012', '\126', '\167', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\164', '\113', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\121', '\170', '\040', '\163', '\164', '\040', '\061', + '\012', '\157', '\116', '\155', '\040', '\157', '\156', '\040', '\061', + '\012', '\165', '\130', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\163', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\127', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\146', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\111', '\152', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\153', '\127', '\040', '\144', '\145', '\040', '\061', + '\012', '\116', '\170', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\165', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\120', '\171', '\040', '\142', '\145', '\040', '\061', + '\012', '\154', '\113', '\163', '\040', '\154', '\145', '\040', '\061', + '\012', '\141', '\114', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\120', '\160', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\160', '\132', '\040', '\160', '\162', '\040', '\061', + '\012', '\146', '\152', '\105', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\116', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\150', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\121', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\170', '\102', '\040', '\142', '\145', '\040', '\061', + '\012', '\146', '\144', '\130', '\040', '\144', '\145', '\040', '\061', + '\012', '\112', '\143', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\106', '\144', '\160', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\126', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\164', '\155', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\152', '\112', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\172', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\164', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\143', '\130', '\040', '\143', '\150', '\040', '\061', + '\012', '\107', '\150', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\132', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\113', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\166', '\117', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\130', '\163', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\122', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\147', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\160', '\117', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\127', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\125', '\160', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\167', '\104', '\040', '\166', '\141', '\040', '\061', + '\012', '\155', '\170', '\105', '\040', '\155', '\145', '\040', '\061', + '\012', '\132', '\166', '\155', '\040', '\166', '\141', '\040', '\061', + '\012', '\157', '\172', '\115', '\040', '\157', '\156', '\040', '\061', + '\012', '\146', '\142', '\112', '\040', '\142', '\145', '\040', '\061', + '\012', '\164', '\160', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\145', '\126', '\040', '\145', '\162', '\040', '\061', + '\012', '\132', '\156', '\142', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\130', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\142', '\143', '\131', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\147', '\132', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\146', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\143', '\114', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\130', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\165', '\102', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\170', '\127', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\164', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\147', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\101', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\102', '\166', '\040', '\151', '\152', '\040', '\061', + '\012', '\107', '\164', '\171', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\146', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\170', '\161', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\102', '\160', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\161', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\166', '\115', '\040', '\166', '\141', '\040', '\061', + '\012', '\165', '\127', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\123', '\142', '\040', '\145', '\162', '\040', '\061', + '\012', '\130', '\161', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\124', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\114', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\112', '\162', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\157', '\112', '\142', '\040', '\157', '\156', '\040', '\061', + '\012', '\160', '\130', '\171', '\040', '\160', '\162', '\040', '\061', + '\012', '\172', '\162', '\121', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\156', '\124', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\163', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\132', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\126', '\171', '\040', '\142', '\145', '\040', '\061', + '\012', '\161', '\111', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\147', '\122', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\114', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\126', '\154', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\122', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\150', '\101', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\114', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\123', '\147', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\114', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\124', '\170', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\160', '\131', '\040', '\160', '\162', '\040', '\061', + '\012', '\164', '\130', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\143', '\103', '\040', '\143', '\150', '\040', '\061', + '\012', '\151', '\131', '\146', '\040', '\151', '\156', '\040', '\061', + '\012', '\127', '\167', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\153', '\132', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\131', '\167', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\106', '\166', '\040', '\156', '\147', '\040', '\061', + '\012', '\106', '\155', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\165', '\121', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\167', '\122', '\040', '\167', '\141', '\040', '\061', + '\012', '\131', '\146', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\141', '\111', '\157', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\102', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\172', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\167', '\111', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\106', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\141', '\127', '\166', '\040', '\141', '\156', '\040', '\061', + '\012', '\105', '\141', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\153', '\127', '\040', '\153', '\141', '\040', '\061', + '\012', '\116', '\146', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\154', '\116', '\040', '\154', '\145', '\040', '\061', + '\012', '\114', '\160', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\171', '\154', '\113', '\040', '\154', '\145', '\040', '\061', + '\012', '\132', '\156', '\162', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\143', '\121', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\146', '\105', '\040', '\153', '\141', '\040', '\061', + '\012', '\111', '\171', '\146', '\040', '\156', '\171', '\040', '\061', + '\012', '\161', '\162', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\120', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\146', '\147', '\112', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\111', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\142', '\120', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\121', '\171', '\170', '\040', '\156', '\171', '\040', '\061', + '\012', '\121', '\156', '\142', '\040', '\141', '\156', '\040', '\061', + '\012', '\127', '\144', '\155', '\040', '\144', '\145', '\040', '\061', + '\012', '\156', '\112', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\103', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\132', '\154', '\040', '\156', '\147', '\040', '\061', + '\012', '\116', '\154', '\172', '\040', '\154', '\145', '\040', '\061', + '\012', '\132', '\167', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\127', '\154', '\040', '\151', '\156', '\040', '\061', + '\012', '\142', '\125', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\142', '\112', '\040', '\154', '\145', '\040', '\061', + '\012', '\163', '\116', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\152', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\142', '\124', '\040', '\167', '\141', '\040', '\061', + '\012', '\171', '\116', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\170', '\115', '\040', '\155', '\145', '\040', '\061', + '\012', '\160', '\110', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\122', '\144', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\153', '\105', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\142', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\124', '\147', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\152', '\126', '\040', '\156', '\147', '\040', '\061', + '\012', '\107', '\152', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\161', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\130', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\121', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\116', '\142', '\040', '\160', '\162', '\040', '\061', + '\012', '\146', '\112', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\171', '\166', '\132', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\116', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\104', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\125', '\172', '\040', '\154', '\145', '\040', '\061', + '\012', '\104', '\170', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\127', '\167', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\120', '\156', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\116', '\142', '\040', '\153', '\157', '\040', '\061', + '\012', '\127', '\144', '\142', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\130', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\152', '\114', '\040', '\151', '\152', '\040', '\061', + '\012', '\164', '\112', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\155', '\115', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\130', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\124', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\131', '\163', '\146', '\040', '\163', '\164', '\040', '\061', + '\012', '\150', '\155', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\171', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\106', '\160', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\121', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\120', '\142', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\126', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\150', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\123', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\107', '\170', '\172', '\040', '\172', '\145', '\040', '\061', + '\012', '\104', '\146', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\162', '\115', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\172', '\115', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\112', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\112', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\146', '\116', '\040', '\146', '\157', '\040', '\061', + '\012', '\144', '\121', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\165', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\152', '\102', '\040', '\151', '\152', '\040', '\061', + '\012', '\154', '\120', '\152', '\040', '\154', '\145', '\040', '\061', + '\012', '\155', '\161', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\146', '\115', '\040', '\155', '\145', '\040', '\061', + '\012', '\153', '\167', '\107', '\040', '\153', '\141', '\040', '\061', + '\012', '\145', '\141', '\131', '\040', '\141', '\156', '\040', '\061', + '\012', '\126', '\155', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\172', '\146', '\123', '\040', '\163', '\172', '\040', '\061', + '\012', '\106', '\155', '\171', '\040', '\155', '\145', '\040', '\061', + '\012', '\163', '\161', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\113', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\121', '\144', '\166', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\152', '\132', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\162', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\170', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\170', '\110', '\040', '\142', '\145', '\040', '\061', + '\012', '\152', '\122', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\152', '\104', '\040', '\143', '\150', '\040', '\061', + '\012', '\123', '\170', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\123', '\170', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\162', '\132', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\155', '\110', '\040', '\155', '\145', '\040', '\061', + '\012', '\144', '\146', '\110', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\112', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\155', '\167', '\132', '\040', '\155', '\145', '\040', '\061', + '\012', '\166', '\122', '\155', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\167', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\130', '\161', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\107', '\166', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\150', '\172', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\156', '\113', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\150', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\116', '\154', '\163', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\142', '\126', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\124', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\170', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\165', '\160', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\101', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\113', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\154', '\104', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\124', '\154', '\040', '\164', '\150', '\040', '\061', + '\012', '\107', '\161', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\170', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\172', '\120', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\166', '\132', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\110', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\151', '\130', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\113', '\147', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\112', '\171', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\166', '\106', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\164', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\102', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\147', '\117', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\152', '\116', '\040', '\151', '\152', '\040', '\061', + '\012', '\104', '\152', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\111', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\165', '\104', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\112', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\101', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\106', '\163', '\152', '\040', '\163', '\164', '\040', '\061', + '\012', '\171', '\104', '\146', '\040', '\156', '\171', '\040', '\061', + '\012', '\170', '\152', '\126', '\040', '\151', '\152', '\040', '\061', + '\012', '\150', '\144', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\167', '\107', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\154', '\127', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\131', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\172', '\117', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\161', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\172', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\155', '\107', '\040', '\155', '\145', '\040', '\061', + '\012', '\113', '\144', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\126', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\164', '\105', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\112', '\171', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\152', '\127', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\167', '\122', '\040', '\155', '\145', '\040', '\061', + '\012', '\172', '\126', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\115', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\161', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\154', '\121', '\040', '\154', '\145', '\040', '\061', + '\012', '\142', '\170', '\121', '\040', '\142', '\145', '\040', '\061', + '\012', '\150', '\112', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\156', '\131', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\146', '\123', '\040', '\156', '\171', '\040', '\061', + '\012', '\115', '\144', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\132', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\163', '\112', '\040', '\163', '\164', '\040', '\061', + '\012', '\121', '\161', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\170', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\101', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\112', '\167', '\040', '\154', '\145', '\040', '\061', + '\012', '\153', '\167', '\112', '\040', '\153', '\141', '\040', '\061', + '\012', '\163', '\170', '\103', '\040', '\163', '\164', '\040', '\061', + '\012', '\150', '\112', '\162', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\107', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\143', '\143', '\106', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\107', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\123', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\161', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\153', '\126', '\040', '\153', '\141', '\040', '\061', + '\012', '\147', '\126', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\161', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\112', '\160', '\040', '\153', '\141', '\040', '\061', + '\012', '\127', '\154', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\112', '\167', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\105', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\162', '\114', '\040', '\145', '\162', '\040', '\061', + '\012', '\164', '\161', '\105', '\040', '\164', '\150', '\040', '\061', + '\012', '\145', '\112', '\172', '\040', '\145', '\162', '\040', '\061', + '\012', '\127', '\150', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\127', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\121', '\172', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\143', '\106', '\040', '\143', '\150', '\040', '\061', + '\012', '\126', '\155', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\144', '\166', '\103', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\152', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\153', '\106', '\040', '\153', '\141', '\040', '\061', + '\012', '\143', '\166', '\117', '\040', '\143', '\150', '\040', '\061', + '\012', '\121', '\171', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\116', '\163', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\156', '\112', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\152', '\125', '\040', '\151', '\152', '\040', '\061', + '\012', '\131', '\146', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\114', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\162', '\126', '\172', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\117', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\170', '\114', '\040', '\146', '\157', '\040', '\061', + '\012', '\163', '\156', '\127', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\127', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\167', '\147', '\113', '\040', '\156', '\147', '\040', '\061', + '\012', '\141', '\124', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\145', '\126', '\146', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\132', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\165', '\126', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\152', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\167', '\124', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\123', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\156', '\116', '\160', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\146', '\106', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\143', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\124', '\146', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\141', '\112', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\172', '\131', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\152', '\130', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\115', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\142', '\164', '\102', '\040', '\163', '\164', '\040', '\061', + '\012', '\172', '\146', '\105', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\170', '\117', '\040', '\142', '\145', '\040', '\061', + '\012', '\167', '\120', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\147', '\113', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\172', '\127', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\143', '\130', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\161', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\115', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\132', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\164', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\153', '\131', '\040', '\153', '\141', '\040', '\061', + '\012', '\154', '\103', '\142', '\040', '\154', '\145', '\040', '\061', + '\012', '\144', '\160', '\117', '\040', '\144', '\145', '\040', '\061', + '\012', '\155', '\130', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\166', '\127', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\117', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\147', '\171', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\153', '\104', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\121', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\111', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\132', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\172', '\113', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\126', '\160', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\104', '\155', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\116', '\167', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\153', '\131', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\160', '\112', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\130', '\151', '\040', '\161', '\165', '\040', '\061', + '\012', '\102', '\156', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\146', '\113', '\040', '\146', '\157', '\040', '\061', + '\012', '\146', '\103', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\120', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\121', '\156', '\160', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\160', '\127', '\040', '\160', '\162', '\040', '\061', + '\012', '\165', '\167', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\120', '\166', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\143', '\156', '\103', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\166', '\101', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\107', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\132', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\142', '\123', '\040', '\153', '\141', '\040', '\061', + '\012', '\123', '\167', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\150', '\166', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\161', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\114', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\152', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\125', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\154', '\104', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\154', '\160', '\040', '\154', '\145', '\040', '\061', + '\012', '\144', '\167', '\121', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\154', '\116', '\040', '\154', '\145', '\040', '\061', + '\012', '\146', '\124', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\116', '\160', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\142', '\115', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\116', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\145', '\146', '\126', '\040', '\145', '\162', '\040', '\061', + '\012', '\141', '\103', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\141', '\127', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\114', '\161', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\172', '\124', '\040', '\163', '\172', '\040', '\061', + '\012', '\112', '\152', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\172', '\166', '\113', '\040', '\163', '\172', '\040', '\061', + '\012', '\156', '\167', '\124', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\130', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\107', '\155', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\166', '\123', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\104', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\122', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\131', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\121', '\166', '\040', '\151', '\156', '\040', '\061', + '\012', '\146', '\153', '\110', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\143', '\117', '\040', '\143', '\150', '\040', '\061', + '\012', '\162', '\116', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\155', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\172', '\122', '\040', '\163', '\172', '\040', '\061', + '\012', '\104', '\146', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\125', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\161', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\130', '\153', '\040', '\163', '\164', '\040', '\061', + '\012', '\130', '\171', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\127', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\142', '\114', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\131', '\144', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\161', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\106', '\161', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\157', '\130', '\040', '\157', '\156', '\040', '\061', + '\012', '\172', '\165', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\125', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\147', '\103', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\102', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\121', '\160', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\156', '\105', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\132', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\153', '\104', '\040', '\153', '\141', '\040', '\061', + '\012', '\163', '\126', '\153', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\171', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\102', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\103', '\152', '\171', '\040', '\151', '\152', '\040', '\061', + '\012', '\144', '\120', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\104', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\170', '\102', '\040', '\144', '\145', '\040', '\061', + '\012', '\104', '\153', '\155', '\040', '\153', '\141', '\040', '\061', + '\012', '\153', '\120', '\160', '\040', '\153', '\141', '\040', '\061', + '\012', '\150', '\127', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\102', '\152', '\166', '\040', '\151', '\152', '\040', '\061', + '\012', '\111', '\172', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\110', '\156', '\153', '\040', '\141', '\156', '\040', '\061', + '\012', '\162', '\121', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\112', '\167', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\142', '\120', '\040', '\142', '\145', '\040', '\061', + '\012', '\146', '\162', '\121', '\040', '\145', '\162', '\040', '\061', + '\012', '\101', '\157', '\166', '\040', '\157', '\156', '\040', '\061', + '\012', '\171', '\161', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\146', '\131', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\163', '\110', '\040', '\163', '\164', '\040', '\061', + '\012', '\172', '\170', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\142', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\115', '\152', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\122', '\160', '\040', '\156', '\147', '\040', '\061', + '\012', '\107', '\166', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\155', '\172', '\106', '\040', '\163', '\172', '\040', '\061', + '\012', '\157', '\161', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\145', '\152', '\125', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\155', '\121', '\040', '\155', '\145', '\040', '\061', + '\012', '\150', '\117', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\167', '\130', '\040', '\160', '\162', '\040', '\061', + '\012', '\172', '\147', '\113', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\114', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\161', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\120', '\155', '\040', '\144', '\145', '\040', '\061', + '\012', '\164', '\103', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\162', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\127', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\162', '\104', '\146', '\040', '\145', '\162', '\040', '\061', + '\012', '\131', '\156', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\156', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\106', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\160', '\125', '\040', '\145', '\162', '\040', '\061', + '\012', '\160', '\120', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\152', '\115', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\155', '\131', '\040', '\151', '\152', '\040', '\061', + '\012', '\103', '\160', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\165', '\104', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\165', '\161', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\120', '\152', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\106', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\113', '\164', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\143', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\160', '\117', '\040', '\160', '\162', '\040', '\061', + '\012', '\160', '\147', '\132', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\146', '\117', '\040', '\153', '\141', '\040', '\061', + '\012', '\164', '\132', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\110', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\122', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\104', '\155', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\120', '\155', '\040', '\154', '\145', '\040', '\061', + '\012', '\163', '\166', '\120', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\153', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\116', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\113', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\161', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\121', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\164', '\170', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\160', '\146', '\040', '\160', '\162', '\040', '\061', + '\012', '\151', '\121', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\166', '\120', '\040', '\166', '\141', '\040', '\061', + '\012', '\151', '\107', '\146', '\040', '\151', '\156', '\040', '\061', + '\012', '\164', '\152', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\127', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\121', '\161', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\151', '\106', '\040', '\164', '\151', '\040', '\061', + '\012', '\132', '\172', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\141', '\131', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\152', '\101', '\040', '\163', '\172', '\040', '\061', + '\012', '\153', '\167', '\122', '\040', '\153', '\141', '\040', '\061', + '\012', '\147', '\153', '\115', '\040', '\156', '\147', '\040', '\061', + '\012', '\103', '\152', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\147', '\115', '\040', '\156', '\147', '\040', '\061', + '\012', '\122', '\170', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\142', '\103', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\131', '\160', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\171', '\105', '\040', '\167', '\141', '\040', '\061', + '\012', '\151', '\171', '\102', '\040', '\151', '\156', '\040', '\061', + '\012', '\150', '\121', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\160', '\121', '\040', '\151', '\156', '\040', '\061', + '\012', '\125', '\143', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\153', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\162', '\113', '\040', '\145', '\162', '\040', '\061', + '\012', '\110', '\160', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\170', '\156', '\116', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\167', '\102', '\040', '\151', '\152', '\040', '\061', + '\012', '\132', '\144', '\155', '\040', '\144', '\145', '\040', '\061', + '\012', '\155', '\131', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\164', '\121', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\167', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\110', '\170', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\161', '\104', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\130', '\144', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\144', '\117', '\040', '\156', '\147', '\040', '\061', + '\012', '\141', '\105', '\157', '\040', '\141', '\156', '\040', '\061', + '\012', '\124', '\167', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\141', '\166', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\154', '\150', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\172', '\126', '\040', '\154', '\145', '\040', '\061', + '\012', '\142', '\110', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\142', '\112', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\125', '\161', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\106', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\116', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\102', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\144', '\122', '\142', '\040', '\144', '\145', '\040', '\061', + '\012', '\156', '\154', '\124', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\162', '\117', '\040', '\145', '\162', '\040', '\061', + '\012', '\154', '\172', '\127', '\040', '\154', '\145', '\040', '\061', + '\012', '\146', '\131', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\155', '\122', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\162', '\130', '\171', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\171', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\107', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\125', '\167', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\153', '\130', '\155', '\040', '\153', '\141', '\040', '\061', + '\012', '\150', '\112', '\171', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\147', '\166', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\131', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\171', '\131', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\172', '\103', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\152', '\102', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\172', '\111', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\162', '\117', '\040', '\145', '\162', '\040', '\061', + '\012', '\164', '\161', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\167', '\115', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\103', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\152', '\114', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\156', '\132', '\040', '\141', '\156', '\040', '\061', + '\012', '\145', '\104', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\166', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\146', '\114', '\040', '\160', '\162', '\040', '\061', + '\012', '\151', '\122', '\142', '\040', '\151', '\156', '\040', '\061', + '\012', '\147', '\144', '\122', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\101', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\156', '\114', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\153', '\124', '\040', '\153', '\141', '\040', '\061', + '\012', '\160', '\126', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\113', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\116', '\153', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\114', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\116', '\160', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\155', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\126', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\146', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\125', '\161', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\104', '\156', '\160', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\107', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\163', '\110', '\144', '\040', '\163', '\164', '\040', '\061', + '\012', '\160', '\167', '\106', '\040', '\160', '\162', '\040', '\061', + '\012', '\146', '\120', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\104', '\162', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\112', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\121', '\160', '\040', '\163', '\164', '\040', '\061', + '\012', '\111', '\167', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\165', '\103', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\167', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\162', '\106', '\167', '\040', '\145', '\162', '\040', '\061', + '\012', '\163', '\112', '\160', '\040', '\163', '\164', '\040', '\061', + '\012', '\170', '\151', '\111', '\040', '\151', '\156', '\040', '\061', + '\012', '\122', '\161', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\153', '\121', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\116', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\131', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\126', '\155', '\146', '\040', '\155', '\145', '\040', '\061', + '\012', '\154', '\131', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\157', '\120', '\167', '\040', '\157', '\156', '\040', '\061', + '\012', '\153', '\152', '\117', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\113', '\142', '\040', '\155', '\145', '\040', '\061', + '\012', '\146', '\104', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\146', '\106', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\126', '\150', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\146', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\113', '\152', '\160', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\124', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\102', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\110', '\164', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\116', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\142', '\121', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\141', '\123', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\167', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\125', '\171', '\170', '\040', '\156', '\171', '\040', '\061', + '\012', '\167', '\126', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\111', '\157', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\116', '\150', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\161', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\125', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\102', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\107', '\161', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\103', '\143', '\167', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\132', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\142', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\106', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\163', '\132', '\166', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\172', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\104', '\142', '\040', '\160', '\162', '\040', '\061', + '\012', '\143', '\146', '\122', '\040', '\143', '\150', '\040', '\061', + '\012', '\162', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\172', '\120', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\161', '\117', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\172', '\110', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\123', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\170', '\112', '\040', '\160', '\162', '\040', '\061', + '\012', '\170', '\142', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\130', '\146', '\040', '\163', '\164', '\040', '\061', + '\012', '\171', '\142', '\124', '\040', '\142', '\145', '\040', '\061', + '\012', '\163', '\110', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\124', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\120', '\147', '\146', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\113', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\120', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\124', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\152', '\123', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\106', '\147', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\113', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\145', '\125', '\152', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\104', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\106', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\156', '\127', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\125', '\171', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\147', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\165', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\171', '\121', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\103', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\122', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\130', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\107', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\130', '\156', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\120', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\146', '\132', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\126', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\167', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\104', '\172', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\146', '\107', '\040', '\146', '\157', '\040', '\061', + '\012', '\146', '\130', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\147', '\126', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\112', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\130', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\147', '\107', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\165', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\170', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\170', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\116', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\157', '\102', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\147', '\166', '\040', '\156', '\147', '\040', '\061', + '\012', '\110', '\167', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\157', '\141', '\127', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\122', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\165', '\130', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\172', '\121', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\143', '\102', '\040', '\143', '\150', '\040', '\061', + '\012', '\102', '\156', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\166', '\102', '\040', '\156', '\147', '\040', '\061', + '\012', '\162', '\121', '\155', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\166', '\125', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\150', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\170', '\122', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\164', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\113', '\153', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\112', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\165', '\167', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\123', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\171', '\122', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\156', '\103', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\107', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\147', '\124', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\116', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\157', '\110', '\153', '\040', '\157', '\156', '\040', '\061', + '\012', '\127', '\172', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\166', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\153', '\130', '\040', '\163', '\164', '\040', '\061', + '\012', '\166', '\131', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\157', '\132', '\040', '\157', '\156', '\040', '\061', + '\012', '\156', '\107', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\155', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\102', '\155', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\163', '\126', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\165', '\103', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\151', '\130', '\172', '\040', '\151', '\156', '\040', '\061', + '\012', '\166', '\113', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\154', '\105', '\167', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\150', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\167', '\123', '\040', '\151', '\156', '\040', '\061', + '\012', '\161', '\171', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\152', '\131', '\040', '\151', '\152', '\040', '\061', + '\012', '\131', '\147', '\155', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\112', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\145', '\121', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\131', '\146', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\127', '\160', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\144', '\123', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\155', '\107', '\040', '\166', '\141', '\040', '\061', + '\012', '\155', '\144', '\124', '\040', '\144', '\145', '\040', '\061', + '\012', '\147', '\162', '\132', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\161', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\102', '\160', '\040', '\160', '\157', '\040', '\061', + '\012', '\146', '\153', '\132', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\145', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\107', '\163', '\040', '\143', '\150', '\040', '\061', + '\012', '\105', '\161', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\146', '\117', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\123', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\104', '\150', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\152', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\161', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\121', '\146', '\040', '\156', '\171', '\040', '\061', + '\012', '\156', '\160', '\131', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\104', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\155', '\121', '\040', '\155', '\145', '\040', '\061', + '\012', '\153', '\115', '\142', '\040', '\153', '\141', '\040', '\061', + '\012', '\141', '\161', '\103', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\131', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\153', '\104', '\040', '\153', '\141', '\040', '\061', + '\012', '\143', '\127', '\163', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\171', '\112', '\040', '\156', '\171', '\040', '\061', + '\012', '\167', '\166', '\126', '\040', '\166', '\141', '\040', '\061', + '\012', '\154', '\131', '\142', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\162', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\161', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\152', '\103', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\113', '\171', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\152', '\104', '\040', '\151', '\152', '\040', '\061', + '\012', '\163', '\104', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\113', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\172', '\163', '\124', '\040', '\163', '\164', '\040', '\061', + '\012', '\152', '\131', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\131', '\167', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\152', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\111', '\171', '\040', '\167', '\141', '\040', '\061', + '\012', '\146', '\146', '\125', '\040', '\146', '\157', '\040', '\061', + '\012', '\127', '\156', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\145', '\110', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\127', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\116', '\167', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\171', '\123', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\146', '\103', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\130', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\162', '\111', '\040', '\156', '\147', '\040', '\061', + '\012', '\157', '\126', '\146', '\040', '\157', '\156', '\040', '\061', + '\012', '\126', '\146', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\152', '\147', '\131', '\040', '\156', '\147', '\040', '\061', + '\012', '\110', '\152', '\160', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\161', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\171', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\143', '\121', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\163', '\105', '\040', '\163', '\164', '\040', '\061', + '\012', '\160', '\103', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\153', '\167', '\120', '\040', '\153', '\141', '\040', '\061', + '\012', '\152', '\146', '\121', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\132', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\126', '\170', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\112', '\166', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\163', '\105', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\114', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\144', '\117', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\160', '\123', '\040', '\160', '\162', '\040', '\061', + '\012', '\171', '\111', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\164', '\107', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\110', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\107', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\166', '\121', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\116', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\161', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\146', '\113', '\040', '\163', '\164', '\040', '\061', + '\012', '\144', '\131', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\115', '\155', '\040', '\163', '\164', '\040', '\061', + '\012', '\157', '\102', '\170', '\040', '\157', '\156', '\040', '\061', + '\012', '\161', '\163', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\155', '\111', '\040', '\155', '\145', '\040', '\061', + '\012', '\164', '\155', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\154', '\127', '\040', '\154', '\145', '\040', '\061', + '\012', '\124', '\167', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\162', '\126', '\040', '\145', '\162', '\040', '\061', + '\012', '\162', '\116', '\172', '\040', '\145', '\162', '\040', '\061', + '\012', '\125', '\165', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\107', '\152', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\156', '\152', '\131', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\117', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\155', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\156', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\166', '\131', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\107', '\146', '\040', '\160', '\162', '\040', '\061', + '\012', '\154', '\110', '\160', '\040', '\141', '\154', '\040', '\061', + '\012', '\161', '\147', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\142', '\123', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\121', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\164', '\161', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\167', '\111', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\153', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\170', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\150', '\104', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\121', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\151', '\112', '\160', '\040', '\151', '\156', '\040', '\061', + '\012', '\170', '\162', '\116', '\040', '\145', '\162', '\040', '\061', + '\012', '\144', '\107', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\121', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\112', '\161', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\115', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\152', '\124', '\040', '\154', '\145', '\040', '\061', + '\012', '\130', '\153', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\164', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\116', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\165', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\125', '\157', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\152', '\122', '\040', '\144', '\145', '\040', '\061', + '\012', '\155', '\106', '\146', '\040', '\155', '\145', '\040', '\061', + '\012', '\152', '\172', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\152', '\122', '\040', '\163', '\172', '\040', '\061', + '\012', '\116', '\156', '\154', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\112', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\132', '\162', '\040', '\156', '\147', '\040', '\061', + '\012', '\102', '\167', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\144', '\127', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\167', '\115', '\040', '\154', '\145', '\040', '\061', + '\012', '\111', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\167', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\115', '\167', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\152', '\131', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\102', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\151', '\167', '\106', '\040', '\151', '\156', '\040', '\061', + '\012', '\162', '\110', '\172', '\040', '\145', '\162', '\040', '\061', + '\012', '\123', '\161', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\157', '\113', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\152', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\164', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\113', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\161', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\131', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\102', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\155', '\112', '\040', '\156', '\147', '\040', '\061', + '\012', '\145', '\131', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\107', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\121', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\156', '\130', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\166', '\112', '\040', '\166', '\141', '\040', '\061', + '\012', '\163', '\170', '\115', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\116', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\154', '\152', '\040', '\154', '\145', '\040', '\061', + '\012', '\153', '\161', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\144', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\150', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\154', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\161', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\142', '\104', '\040', '\142', '\145', '\040', '\061', + '\012', '\170', '\101', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\160', '\114', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\110', '\142', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\126', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\150', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\170', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\126', '\146', '\040', '\144', '\145', '\040', '\061', + '\012', '\132', '\153', '\155', '\040', '\153', '\141', '\040', '\061', + '\012', '\153', '\160', '\104', '\040', '\153', '\141', '\040', '\061', + '\012', '\160', '\152', '\110', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\107', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\151', '\171', '\120', '\040', '\151', '\156', '\040', '\061', + '\012', '\167', '\155', '\113', '\040', '\155', '\145', '\040', '\061', + '\012', '\155', '\112', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\155', '\114', '\040', '\155', '\145', '\040', '\061', + '\012', '\143', '\102', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\126', '\166', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\105', '\161', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\150', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\103', '\170', '\040', '\154', '\145', '\040', '\061', + '\012', '\157', '\127', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\156', '\172', '\130', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\111', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\120', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\131', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\172', '\150', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\161', '\116', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\155', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\130', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\154', '\132', '\152', '\040', '\154', '\145', '\040', '\061', + '\012', '\123', '\170', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\113', '\161', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\127', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\113', '\143', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\166', '\102', '\040', '\160', '\157', '\040', '\061', + '\012', '\164', '\147', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\162', '\116', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\121', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\130', '\166', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\112', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\146', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\106', '\166', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\125', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\154', '\132', '\142', '\040', '\154', '\145', '\040', '\061', + '\012', '\147', '\144', '\111', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\157', '\111', '\040', '\157', '\156', '\040', '\061', + '\012', '\171', '\113', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\167', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\112', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\170', '\115', '\040', '\166', '\141', '\040', '\061', + '\012', '\126', '\172', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\152', '\122', '\040', '\151', '\152', '\040', '\061', + '\012', '\113', '\155', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\111', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\171', '\104', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\142', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\153', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\126', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\106', '\150', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\112', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\120', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\125', '\145', '\157', '\040', '\145', '\162', '\040', '\061', + '\012', '\172', '\130', '\144', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\106', '\142', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\112', '\171', '\040', '\151', '\152', '\040', '\061', + '\012', '\116', '\163', '\152', '\040', '\163', '\164', '\040', '\061', + '\012', '\154', '\115', '\142', '\040', '\154', '\145', '\040', '\061', + '\012', '\171', '\121', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\156', '\115', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\122', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\106', '\152', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\113', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\161', '\126', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\103', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\117', '\172', '\040', '\163', '\164', '\040', '\061', + '\012', '\150', '\154', '\117', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\142', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\152', '\116', '\040', '\163', '\164', '\040', '\061', + '\012', '\125', '\152', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\162', '\126', '\155', '\040', '\145', '\162', '\040', '\061', + '\012', '\127', '\152', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\142', '\155', '\115', '\040', '\155', '\145', '\040', '\061', + '\012', '\126', '\172', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\132', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\106', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\150', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\116', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\142', '\124', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\155', '\112', '\040', '\155', '\145', '\040', '\061', + '\012', '\106', '\143', '\163', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\124', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\123', '\147', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\155', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\106', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\144', '\111', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\154', '\113', '\040', '\154', '\145', '\040', '\061', + '\012', '\142', '\156', '\102', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\171', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\152', '\153', '\040', '\151', '\152', '\040', '\061', + '\012', '\150', '\172', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\147', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\161', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\116', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\124', '\152', '\160', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\154', '\126', '\040', '\154', '\145', '\040', '\061', + '\012', '\162', '\126', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\142', '\114', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\144', '\121', '\040', '\144', '\145', '\040', '\061', + '\012', '\147', '\131', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\150', '\105', '\040', '\164', '\150', '\040', '\061', + '\012', '\107', '\163', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\127', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\121', '\164', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\172', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\153', '\111', '\157', '\040', '\150', '\157', '\040', '\061', + '\012', '\153', '\146', '\103', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\102', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\112', '\160', '\040', '\151', '\152', '\040', '\061', + '\012', '\145', '\111', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\165', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\142', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\112', '\152', '\160', '\040', '\151', '\152', '\040', '\061', + '\012', '\154', '\130', '\153', '\040', '\154', '\145', '\040', '\061', + '\012', '\124', '\146', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\172', '\114', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\144', '\161', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\132', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\146', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\150', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\153', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\105', '\152', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\167', '\116', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\121', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\104', '\160', '\040', '\144', '\145', '\040', '\061', + '\012', '\120', '\167', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\172', '\164', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\164', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\162', '\130', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\167', '\124', '\040', '\166', '\141', '\040', '\061', + '\012', '\171', '\122', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\121', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\130', '\172', '\040', '\154', '\145', '\040', '\061', + '\012', '\143', '\146', '\114', '\040', '\143', '\150', '\040', '\061', + '\012', '\106', '\167', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\162', '\116', '\167', '\040', '\145', '\162', '\040', '\061', + '\012', '\102', '\150', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\154', '\132', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\143', '\104', '\040', '\143', '\150', '\040', '\061', + '\012', '\123', '\146', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\125', '\172', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\124', '\144', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\144', '\122', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\131', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\143', '\104', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\143', '\103', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\102', '\170', '\040', '\154', '\145', '\040', '\061', + '\012', '\147', '\110', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\112', '\171', '\040', '\167', '\141', '\040', '\061', + '\012', '\171', '\162', '\117', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\161', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\131', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\152', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\114', '\153', '\040', '\151', '\152', '\040', '\061', + '\012', '\110', '\166', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\156', '\123', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\143', '\124', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\106', '\153', '\040', '\163', '\164', '\040', '\061', + '\012', '\144', '\143', '\117', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\120', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\116', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\107', '\144', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\154', '\120', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\114', '\170', '\040', '\152', '\157', '\040', '\061', + '\012', '\152', '\132', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\167', '\124', '\040', '\167', '\141', '\040', '\061', + '\012', '\164', '\107', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\150', '\123', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\164', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\156', '\127', '\040', '\157', '\156', '\040', '\061', + '\012', '\160', '\153', '\112', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\111', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\132', '\170', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\156', '\117', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\110', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\152', '\123', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\144', '\114', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\142', '\116', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\153', '\117', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\161', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\172', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\142', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\106', '\161', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\127', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\156', '\170', '\115', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\160', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\124', '\164', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\163', '\110', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\152', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\111', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\153', '\131', '\040', '\153', '\141', '\040', '\061', + '\012', '\106', '\161', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\157', '\107', '\153', '\040', '\157', '\156', '\040', '\061', + '\012', '\110', '\156', '\143', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\120', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\154', '\127', '\040', '\154', '\145', '\040', '\061', + '\012', '\165', '\122', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\107', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\131', '\166', '\040', '\151', '\152', '\040', '\061', + '\012', '\113', '\160', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\121', '\157', '\040', '\156', '\147', '\040', '\061', + '\012', '\113', '\167', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\152', '\116', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\164', '\144', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\107', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\114', '\142', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\162', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\166', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\150', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\132', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\104', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\120', '\152', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\147', '\106', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\103', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\127', '\167', '\040', '\157', '\167', '\040', '\061', + '\012', '\155', '\112', '\160', '\040', '\155', '\145', '\040', '\061', + '\012', '\146', '\130', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\165', '\131', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\110', '\153', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\144', '\120', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\106', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\162', '\107', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\147', '\104', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\163', '\107', '\040', '\163', '\164', '\040', '\061', + '\012', '\126', '\147', '\142', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\101', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\164', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\154', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\124', '\155', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\147', '\171', '\131', '\040', '\156', '\147', '\040', '\061', + '\012', '\121', '\170', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\125', '\170', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\151', '\126', '\162', '\040', '\151', '\156', '\040', '\061', + '\012', '\172', '\161', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\116', '\142', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\104', '\150', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\117', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\151', '\102', '\144', '\040', '\151', '\156', '\040', '\061', + '\012', '\143', '\161', '\102', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\121', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\142', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\121', '\153', '\163', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\120', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\146', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\132', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\160', '\104', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\156', '\112', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\143', '\160', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\127', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\170', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\166', '\120', '\171', '\040', '\166', '\141', '\040', '\061', + '\012', '\144', '\170', '\113', '\040', '\144', '\145', '\040', '\061', + '\012', '\157', '\120', '\166', '\040', '\157', '\156', '\040', '\061', + '\012', '\162', '\152', '\116', '\040', '\145', '\162', '\040', '\061', + '\012', '\157', '\121', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\167', '\110', '\040', '\166', '\141', '\040', '\061', + '\012', '\121', '\150', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\163', '\125', '\040', '\163', '\164', '\040', '\061', + '\012', '\153', '\107', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\152', '\127', '\040', '\151', '\152', '\040', '\061', + '\012', '\120', '\167', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\102', '\142', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\117', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\160', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\142', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\160', '\115', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\155', '\102', '\040', '\151', '\152', '\040', '\061', + '\012', '\116', '\161', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\131', '\144', '\040', '\163', '\172', '\040', '\061', + '\012', '\131', '\142', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\143', '\127', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\120', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\121', '\171', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\102', '\150', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\107', '\170', '\040', '\156', '\171', '\040', '\061', + '\012', '\161', '\170', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\146', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\155', '\142', '\126', '\040', '\155', '\145', '\040', '\061', + '\012', '\160', '\153', '\131', '\040', '\153', '\141', '\040', '\061', + '\012', '\143', '\127', '\154', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\102', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\117', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\107', '\160', '\142', '\040', '\160', '\162', '\040', '\061', + '\012', '\120', '\160', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\163', '\130', '\040', '\163', '\164', '\040', '\061', + '\012', '\166', '\164', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\103', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\157', '\131', '\040', '\157', '\156', '\040', '\061', + '\012', '\160', '\167', '\121', '\040', '\160', '\162', '\040', '\061', + '\012', '\171', '\107', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\164', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\162', '\132', '\040', '\141', '\156', '\040', '\061', + '\012', '\145', '\126', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\116', '\162', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\164', '\101', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\110', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\147', '\163', '\121', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\154', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\114', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\152', '\103', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\166', '\131', '\040', '\151', '\152', '\040', '\061', + '\012', '\164', '\111', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\166', '\114', '\040', '\166', '\141', '\040', '\061', + '\012', '\110', '\150', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\115', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\115', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\131', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\126', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\131', '\156', '\142', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\155', '\130', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\152', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\121', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\121', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\116', '\146', '\040', '\155', '\145', '\040', '\061', + '\012', '\172', '\146', '\131', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\152', '\123', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\102', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\160', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\112', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\113', '\156', '\172', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\107', '\146', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\132', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\107', '\161', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\125', '\161', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\145', '\127', '\166', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\107', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\163', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\150', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\150', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\170', '\123', '\040', '\156', '\171', '\040', '\061', + '\012', '\162', '\170', '\113', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\116', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\167', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\141', '\116', '\166', '\040', '\141', '\156', '\040', '\061', + '\012', '\121', '\172', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\121', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\172', '\110', '\040', '\163', '\172', '\040', '\061', + '\012', '\122', '\166', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\160', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\130', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\150', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\154', '\142', '\040', '\154', '\145', '\040', '\061', + '\012', '\142', '\156', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\156', '\152', '\113', '\040', '\141', '\156', '\040', '\061', + '\012', '\112', '\152', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\164', '\112', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\167', '\130', '\040', '\151', '\156', '\040', '\061', + '\012', '\156', '\126', '\144', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\172', '\101', '\040', '\163', '\172', '\040', '\061', + '\012', '\165', '\167', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\124', '\163', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\161', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\122', '\156', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\162', '\104', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\116', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\165', '\161', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\113', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\111', '\161', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\110', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\127', '\167', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\115', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\127', '\146', '\040', '\156', '\171', '\040', '\061', + '\012', '\166', '\143', '\117', '\040', '\143', '\150', '\040', '\061', + '\012', '\107', '\153', '\155', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\122', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\115', '\143', '\040', '\156', '\144', '\040', '\061', + '\012', '\132', '\150', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\154', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\125', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\110', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\103', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\121', '\146', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\121', '\153', '\167', '\040', '\153', '\141', '\040', '\061', + '\012', '\155', '\131', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\143', '\125', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\124', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\162', '\152', '\106', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\170', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\116', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\114', '\147', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\106', '\144', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\112', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\143', '\121', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\130', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\167', '\167', '\121', '\040', '\167', '\141', '\040', '\061', + '\012', '\145', '\166', '\121', '\040', '\145', '\162', '\040', '\061', + '\012', '\106', '\143', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\103', '\171', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\160', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\101', '\170', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\107', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\121', '\142', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\166', '\146', '\131', '\040', '\166', '\141', '\040', '\061', + '\012', '\157', '\130', '\144', '\040', '\157', '\156', '\040', '\061', + '\012', '\167', '\101', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\142', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\167', '\155', '\122', '\040', '\155', '\145', '\040', '\061', + '\012', '\162', '\172', '\116', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\143', '\102', '\040', '\143', '\150', '\040', '\061', + '\012', '\102', '\167', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\147', '\123', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\121', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\153', '\112', '\167', '\040', '\153', '\141', '\040', '\061', + '\012', '\142', '\147', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\132', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\146', '\101', '\040', '\167', '\141', '\040', '\061', + '\012', '\152', '\155', '\130', '\040', '\151', '\152', '\040', '\061', + '\012', '\144', '\116', '\160', '\040', '\144', '\145', '\040', '\061', + '\012', '\126', '\170', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\122', '\166', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\132', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\147', '\101', '\040', '\156', '\147', '\040', '\061', + '\012', '\127', '\162', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\143', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\152', '\127', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\120', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\152', '\131', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\125', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\155', '\111', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\110', '\160', '\171', '\040', '\160', '\162', '\040', '\061', + '\012', '\115', '\160', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\153', '\117', '\040', '\153', '\141', '\040', '\061', + '\012', '\101', '\166', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\113', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\102', '\146', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\131', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\105', '\147', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\170', '\110', '\040', '\167', '\141', '\040', '\061', + '\012', '\172', '\110', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\166', '\101', '\040', '\163', '\164', '\040', '\061', + '\012', '\172', '\143', '\120', '\040', '\143', '\150', '\040', '\061', + '\012', '\102', '\170', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\150', '\123', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\114', '\170', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\102', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\127', '\153', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\102', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\167', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\153', '\112', '\040', '\153', '\141', '\040', '\061', + '\012', '\157', '\116', '\152', '\040', '\157', '\156', '\040', '\061', + '\012', '\125', '\147', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\132', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\146', '\120', '\040', '\146', '\157', '\040', '\061', + '\012', '\142', '\131', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\170', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\143', '\111', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\150', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\166', '\120', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\125', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\170', '\103', '\040', '\155', '\145', '\040', '\061', + '\012', '\172', '\120', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\116', '\161', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\146', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\127', '\147', '\160', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\147', '\104', '\040', '\156', '\147', '\040', '\061', + '\012', '\121', '\146', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\143', '\127', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\170', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\160', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\162', '\104', '\040', '\145', '\162', '\040', '\061', + '\012', '\142', '\105', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\142', '\172', '\126', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\167', '\123', '\040', '\167', '\141', '\040', '\061', + '\012', '\155', '\114', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\115', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\106', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\146', '\124', '\040', '\163', '\172', '\040', '\061', + '\012', '\156', '\122', '\153', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\112', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\122', '\155', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\156', '\161', '\122', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\160', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\110', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\124', '\153', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\152', '\107', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\141', '\124', '\040', '\141', '\156', '\040', '\061', + '\012', '\120', '\161', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\154', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\172', '\127', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\106', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\102', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\170', '\117', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\166', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\103', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\121', '\152', '\153', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\102', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\113', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\115', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\122', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\153', '\125', '\040', '\153', '\141', '\040', '\061', + '\012', '\142', '\125', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\131', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\120', '\144', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\157', '\107', '\166', '\040', '\157', '\156', '\040', '\061', + '\012', '\152', '\114', '\171', '\040', '\151', '\152', '\040', '\061', + '\012', '\144', '\165', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\143', '\160', '\040', '\143', '\150', '\040', '\061', + '\012', '\157', '\107', '\170', '\040', '\157', '\156', '\040', '\061', + '\012', '\166', '\107', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\112', '\144', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\151', '\152', '\110', '\040', '\151', '\156', '\040', '\061', + '\012', '\155', '\154', '\130', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\116', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\153', '\103', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\150', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\115', '\166', '\040', '\145', '\162', '\040', '\061', + '\012', '\102', '\147', '\160', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\106', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\127', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\130', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\127', '\143', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\142', '\111', '\040', '\144', '\145', '\040', '\061', + '\012', '\142', '\107', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\145', '\170', '\121', '\040', '\145', '\162', '\040', '\061', + '\012', '\152', '\127', '\152', '\040', '\152', '\157', '\040', '\061', + '\012', '\160', '\121', '\142', '\040', '\160', '\162', '\040', '\061', + '\012', '\152', '\143', '\110', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\117', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\164', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\162', '\103', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\102', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\154', '\172', '\040', '\154', '\145', '\040', '\061', + '\012', '\156', '\110', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\110', '\146', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\130', '\160', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\125', '\170', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\113', '\163', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\127', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\156', '\161', '\132', '\040', '\141', '\156', '\040', '\061', + '\012', '\103', '\170', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\112', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\162', '\127', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\103', '\142', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\161', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\150', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\125', '\146', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\125', '\170', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\112', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\166', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\150', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\103', '\166', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\141', '\120', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\112', '\170', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\104', '\167', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\111', '\170', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\153', '\146', '\123', '\040', '\153', '\141', '\040', '\061', + '\012', '\162', '\132', '\155', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\155', '\105', '\040', '\155', '\145', '\040', '\061', + '\012', '\163', '\114', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\155', '\122', '\040', '\155', '\145', '\040', '\061', + '\012', '\165', '\103', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\106', '\155', '\040', '\153', '\141', '\040', '\061', + '\012', '\113', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\121', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\123', '\146', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\147', '\125', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\166', '\124', '\040', '\166', '\141', '\040', '\061', + '\012', '\155', '\121', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\107', '\142', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\142', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\121', '\153', '\040', '\154', '\145', '\040', '\061', + '\012', '\143', '\111', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\124', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\121', '\147', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\131', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\161', '\120', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\117', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\116', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\146', '\112', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\110', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\153', '\102', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\144', '\105', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\120', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\154', '\126', '\166', '\040', '\154', '\145', '\040', '\061', + '\012', '\155', '\120', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\122', '\155', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\157', '\105', '\040', '\157', '\156', '\040', '\061', + '\012', '\150', '\156', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\166', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\157', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\143', '\130', '\040', '\143', '\150', '\040', '\061', + '\012', '\156', '\155', '\104', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\143', '\130', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\104', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\147', '\111', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\126', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\164', '\104', '\150', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\110', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\153', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\170', '\124', '\040', '\160', '\162', '\040', '\061', + '\012', '\170', '\131', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\162', '\124', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\125', '\142', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\114', '\154', '\155', '\040', '\154', '\145', '\040', '\061', + '\012', '\171', '\152', '\132', '\040', '\151', '\152', '\040', '\061', + '\012', '\121', '\163', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\143', '\146', '\115', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\142', '\107', '\040', '\142', '\145', '\040', '\061', + '\012', '\112', '\146', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\155', '\127', '\142', '\040', '\155', '\145', '\040', '\061', + '\012', '\152', '\104', '\160', '\040', '\151', '\152', '\040', '\061', + '\012', '\154', '\127', '\172', '\040', '\154', '\145', '\040', '\061', + '\012', '\143', '\130', '\171', '\040', '\143', '\150', '\040', '\061', + '\012', '\157', '\121', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\165', '\143', '\132', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\166', '\116', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\166', '\113', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\104', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\114', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\144', '\104', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\150', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\155', '\113', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\114', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\161', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\102', '\146', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\101', '\143', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\143', '\107', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\112', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\146', '\123', '\040', '\155', '\145', '\040', '\061', + '\012', '\144', '\162', '\114', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\171', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\121', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\162', '\114', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\143', '\112', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\160', '\130', '\040', '\160', '\162', '\040', '\061', + '\012', '\132', '\172', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\163', '\156', '\125', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\105', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\121', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\120', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\112', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\160', '\125', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\172', '\115', '\040', '\163', '\172', '\040', '\061', + '\012', '\165', '\132', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\167', '\125', '\040', '\167', '\141', '\040', '\061', + '\012', '\122', '\152', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\150', '\113', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\102', '\146', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\167', '\165', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\166', '\115', '\040', '\166', '\141', '\040', '\061', + '\012', '\171', '\151', '\127', '\040', '\151', '\156', '\040', '\061', + '\012', '\150', '\161', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\125', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\102', '\144', '\040', '\154', '\145', '\040', '\061', + '\012', '\132', '\170', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\160', '\127', '\040', '\160', '\162', '\040', '\061', + '\012', '\162', '\110', '\155', '\040', '\145', '\162', '\040', '\061', + '\012', '\155', '\150', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\115', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\166', '\127', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\106', '\144', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\107', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\104', '\150', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\152', '\122', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\166', '\104', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\166', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\155', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\103', '\152', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\153', '\130', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\153', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\127', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\115', '\163', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\116', '\166', '\040', '\141', '\156', '\040', '\061', + '\012', '\110', '\172', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\162', '\131', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\147', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\167', '\102', '\040', '\160', '\162', '\040', '\061', + '\012', '\112', '\170', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\143', '\112', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\131', '\167', '\040', '\163', '\164', '\040', '\061', + '\012', '\124', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\145', '\112', '\146', '\040', '\154', '\145', '\040', '\061', + '\012', '\143', '\172', '\112', '\040', '\143', '\150', '\040', '\061', + '\012', '\121', '\171', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\166', '\126', '\040', '\166', '\141', '\040', '\061', + '\012', '\130', '\171', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\131', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\102', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\152', '\166', '\122', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\142', '\110', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\147', '\110', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\142', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\167', '\125', '\040', '\154', '\145', '\040', '\061', + '\012', '\164', '\112', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\111', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\126', '\152', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\104', '\147', '\155', '\040', '\156', '\147', '\040', '\061', + '\012', '\156', '\166', '\122', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\122', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\146', '\117', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\105', '\143', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\132', '\162', '\146', '\040', '\145', '\162', '\040', '\061', + '\012', '\155', '\170', '\104', '\040', '\155', '\145', '\040', '\061', + '\012', '\111', '\161', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\102', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\124', '\163', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\161', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\103', '\166', '\040', '\153', '\141', '\040', '\061', + '\012', '\156', '\126', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\107', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\147', '\121', '\040', '\143', '\150', '\040', '\061', + '\012', '\120', '\160', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\112', '\143', '\144', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\150', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\114', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\131', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\160', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\163', '\146', '\105', '\040', '\163', '\164', '\040', '\061', + '\012', '\167', '\170', '\122', '\040', '\167', '\141', '\040', '\061', + '\012', '\160', '\106', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\131', '\155', '\146', '\040', '\155', '\145', '\040', '\061', + '\012', '\112', '\147', '\171', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\166', '\111', '\040', '\166', '\141', '\040', '\061', + '\012', '\116', '\143', '\172', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\102', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\162', '\126', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\152', '\166', '\130', '\040', '\151', '\152', '\040', '\061', + '\012', '\156', '\131', '\160', '\040', '\141', '\156', '\040', '\061', + '\012', '\156', '\116', '\142', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\121', '\151', '\040', '\143', '\150', '\040', '\061', + '\012', '\121', '\167', '\171', '\040', '\167', '\141', '\040', '\061', + '\012', '\166', '\120', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\166', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\153', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\155', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\144', '\131', '\040', '\156', '\147', '\040', '\061', + '\012', '\113', '\152', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\163', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\112', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\104', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\166', '\106', '\040', '\153', '\141', '\040', '\061', + '\012', '\153', '\127', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\131', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\145', '\115', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\131', '\171', '\040', '\155', '\145', '\040', '\061', + '\012', '\110', '\170', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\142', '\115', '\040', '\160', '\162', '\040', '\061', + '\012', '\110', '\167', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\155', '\127', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\116', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\121', '\152', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\141', '\161', '\104', '\040', '\141', '\156', '\040', '\061', + '\012', '\107', '\143', '\144', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\164', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\161', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\125', '\152', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\166', '\115', '\040', '\166', '\141', '\040', '\061', + '\012', '\110', '\150', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\127', '\144', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\131', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\127', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\154', '\117', '\040', '\154', '\145', '\040', '\061', + '\012', '\143', '\156', '\130', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\115', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\113', '\142', '\040', '\160', '\162', '\040', '\061', + '\012', '\167', '\157', '\126', '\040', '\157', '\156', '\040', '\061', + '\012', '\146', '\172', '\107', '\040', '\163', '\172', '\040', '\061', + '\012', '\114', '\161', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\145', '\117', '\152', '\040', '\145', '\162', '\040', '\061', + '\012', '\107', '\164', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\154', '\130', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\144', '\103', '\040', '\144', '\145', '\040', '\061', + '\012', '\143', '\146', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\113', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\112', '\151', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\123', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\147', '\124', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\143', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\116', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\160', '\102', '\040', '\160', '\162', '\040', '\061', + '\012', '\166', '\120', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\155', '\101', '\040', '\151', '\152', '\040', '\061', + '\012', '\144', '\170', '\111', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\107', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\102', '\166', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\162', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\120', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\121', '\155', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\161', '\103', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\106', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\164', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\103', '\161', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\103', '\144', '\040', '\145', '\162', '\040', '\061', + '\012', '\132', '\155', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\144', '\126', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\167', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\167', '\120', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\126', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\116', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\130', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\115', '\142', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\166', '\107', '\040', '\166', '\145', '\040', '\061', + '\012', '\126', '\160', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\171', '\130', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\154', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\131', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\106', '\142', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\143', '\126', '\040', '\143', '\150', '\040', '\061', + '\012', '\162', '\121', '\153', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\164', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\145', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\145', '\107', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\115', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\161', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\161', '\144', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\114', '\146', '\040', '\160', '\157', '\040', '\061', + '\012', '\170', '\166', '\117', '\040', '\166', '\141', '\040', '\061', + '\012', '\162', '\146', '\110', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\111', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\120', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\103', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\126', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\151', '\161', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\163', '\112', '\040', '\163', '\164', '\040', '\061', + '\012', '\126', '\167', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\132', '\156', '\155', '\040', '\141', '\156', '\040', '\061', + '\012', '\131', '\162', '\172', '\040', '\145', '\162', '\040', '\061', + '\012', '\122', '\166', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\172', '\113', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\142', '\127', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\153', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\153', '\120', '\040', '\153', '\141', '\040', '\061', + '\012', '\153', '\172', '\123', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\130', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\170', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\106', '\167', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\154', '\110', '\163', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\162', '\102', '\040', '\145', '\162', '\040', '\061', + '\012', '\152', '\116', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\110', '\170', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\107', '\146', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\105', '\147', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\112', '\170', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\164', '\126', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\167', '\121', '\040', '\167', '\141', '\040', '\061', + '\012', '\147', '\111', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\127', '\161', '\165', '\040', '\165', '\156', '\040', '\061', + '\012', '\152', '\166', '\111', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\107', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\123', '\142', '\040', '\153', '\141', '\040', '\061', + '\012', '\150', '\170', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\110', '\155', '\040', '\163', '\172', '\040', '\061', + '\012', '\112', '\160', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\126', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\125', '\153', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\162', '\170', '\106', '\040', '\145', '\162', '\040', '\061', + '\012', '\144', '\126', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\144', '\130', '\040', '\163', '\164', '\040', '\061', + '\012', '\155', '\152', '\115', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\167', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\117', '\147', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\150', '\162', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\146', '\101', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\142', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\146', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\172', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\110', '\146', '\040', '\151', '\156', '\040', '\061', + '\012', '\152', '\170', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\155', '\120', '\040', '\166', '\141', '\040', '\061', + '\012', '\142', '\166', '\111', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\155', '\110', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\164', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\166', '\121', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\172', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\126', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\130', '\155', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\130', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\146', '\104', '\040', '\160', '\162', '\040', '\061', + '\012', '\146', '\103', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\142', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\132', '\150', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\113', '\167', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\162', '\143', '\112', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\154', '\124', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\172', '\115', '\040', '\163', '\172', '\040', '\061', + '\012', '\162', '\160', '\120', '\040', '\145', '\162', '\040', '\061', + '\012', '\164', '\155', '\101', '\040', '\164', '\150', '\040', '\061', + '\012', '\141', '\131', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\102', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\150', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\114', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\113', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\144', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\142', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\144', '\110', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\152', '\150', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\102', '\163', '\166', '\040', '\163', '\164', '\040', '\061', + '\012', '\162', '\132', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\150', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\167', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\130', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\166', '\124', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\151', '\103', '\040', '\151', '\156', '\040', '\061', + '\012', '\147', '\153', '\124', '\040', '\156', '\147', '\040', '\061', + '\012', '\156', '\112', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\160', '\126', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\120', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\126', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\102', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\122', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\122', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\147', '\101', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\115', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\112', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\110', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\103', '\153', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\143', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\111', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\167', '\161', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\115', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\161', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\132', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\151', '\161', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\161', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\157', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\113', '\156', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\121', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\165', '\165', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\172', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\120', '\170', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\121', '\147', '\146', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\106', '\167', '\040', '\163', '\164', '\040', '\061', + '\012', '\147', '\110', '\146', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\147', '\116', '\040', '\156', '\147', '\040', '\061', + '\012', '\162', '\103', '\167', '\040', '\145', '\162', '\040', '\061', + '\012', '\131', '\152', '\171', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\156', '\126', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\142', '\123', '\040', '\142', '\145', '\040', '\061', + '\012', '\151', '\110', '\172', '\040', '\151', '\156', '\040', '\061', + '\012', '\153', '\107', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\153', '\167', '\123', '\040', '\153', '\141', '\040', '\061', + '\012', '\163', '\104', '\155', '\040', '\163', '\164', '\040', '\061', + '\012', '\126', '\150', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\150', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\142', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\160', '\127', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\166', '\121', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\116', '\155', '\040', '\166', '\141', '\040', '\061', + '\012', '\154', '\131', '\167', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\110', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\132', '\172', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\104', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\143', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\112', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\121', '\167', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\106', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\155', '\117', '\040', '\155', '\145', '\040', '\061', + '\012', '\102', '\166', '\171', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\147', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\131', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\170', '\167', '\106', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\167', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\105', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\127', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\172', '\117', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\120', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\156', '\127', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\107', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\153', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\130', '\162', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\112', '\144', '\040', '\156', '\147', '\040', '\061', + '\012', '\114', '\154', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\161', '\165', '\040', '\165', '\156', '\040', '\061', + '\012', '\146', '\147', '\110', '\040', '\156', '\147', '\040', '\061', + '\012', '\126', '\143', '\171', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\126', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\167', '\132', '\040', '\145', '\162', '\040', '\061', + '\012', '\130', '\154', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\112', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\106', '\156', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\131', '\160', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\154', '\150', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\141', '\125', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\154', '\102', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\144', '\154', '\127', '\040', '\154', '\145', '\040', '\061', + '\012', '\160', '\166', '\126', '\040', '\166', '\141', '\040', '\061', + '\012', '\115', '\167', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\132', '\167', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\143', '\125', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\126', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\143', '\125', '\040', '\143', '\150', '\040', '\061', + '\012', '\114', '\143', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\162', '\166', '\121', '\040', '\145', '\162', '\040', '\061', + '\012', '\145', '\131', '\155', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\103', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\102', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\111', '\167', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\115', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\150', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\104', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\126', '\150', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\112', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\117', '\150', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\104', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\124', '\156', '\040', '\164', '\150', '\040', '\061', + '\012', '\145', '\161', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\112', '\162', '\040', '\156', '\147', '\040', '\061', + '\012', '\132', '\160', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\167', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\147', '\131', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\144', '\126', '\040', '\163', '\164', '\040', '\061', + '\012', '\154', '\152', '\126', '\040', '\154', '\145', '\040', '\061', + '\012', '\171', '\107', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\165', '\127', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\142', '\117', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\144', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\112', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\156', '\167', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\101', '\160', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\143', '\113', '\040', '\143', '\150', '\040', '\061', + '\012', '\121', '\167', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\157', '\171', '\121', '\040', '\157', '\156', '\040', '\061', + '\012', '\154', '\120', '\167', '\040', '\154', '\145', '\040', '\061', + '\012', '\143', '\131', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\162', '\107', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\153', '\124', '\040', '\153', '\141', '\040', '\061', + '\012', '\144', '\125', '\152', '\040', '\144', '\145', '\040', '\061', + '\012', '\162', '\150', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\120', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\170', '\157', '\106', '\040', '\157', '\156', '\040', '\061', + '\012', '\150', '\131', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\131', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\120', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\103', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\112', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\104', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\126', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\167', '\127', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\114', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\141', '\102', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\104', '\166', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\164', '\113', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\146', '\107', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\115', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\142', '\114', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\170', '\167', '\127', '\040', '\167', '\141', '\040', '\061', + '\012', '\142', '\172', '\110', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\111', '\167', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\144', '\116', '\040', '\163', '\172', '\040', '\061', + '\012', '\107', '\147', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\154', '\167', '\126', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\171', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\102', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\117', '\167', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\114', '\164', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\161', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\152', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\172', '\131', '\040', '\163', '\172', '\040', '\061', + '\012', '\112', '\144', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\153', '\115', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\104', '\144', '\152', '\040', '\144', '\145', '\040', '\061', + '\012', '\164', '\146', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\161', '\124', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\165', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\110', '\142', '\040', '\160', '\157', '\040', '\061', + '\012', '\166', '\122', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\171', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\160', '\131', '\040', '\153', '\141', '\040', '\061', + '\012', '\166', '\161', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\116', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\127', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\142', '\112', '\040', '\156', '\147', '\040', '\061', + '\012', '\157', '\132', '\167', '\040', '\157', '\156', '\040', '\061', + '\012', '\143', '\102', '\172', '\040', '\143', '\150', '\040', '\061', + '\012', '\120', '\166', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\154', '\152', '\111', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\166', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\167', '\131', '\040', '\153', '\141', '\040', '\061', + '\012', '\150', '\102', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\144', '\116', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\170', '\110', '\040', '\156', '\171', '\040', '\061', + '\012', '\146', '\170', '\110', '\040', '\146', '\157', '\040', '\061', + '\012', '\164', '\130', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\102', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\112', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\170', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\152', '\113', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\161', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\115', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\126', '\170', '\040', '\154', '\145', '\040', '\061', + '\012', '\122', '\150', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\104', '\156', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\153', '\166', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\155', '\102', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\141', '\131', '\040', '\141', '\156', '\040', '\061', + '\012', '\111', '\166', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\155', '\120', '\040', '\155', '\145', '\040', '\061', + '\012', '\142', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\155', '\125', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\154', '\103', '\040', '\154', '\145', '\040', '\061', + '\012', '\113', '\162', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\151', '\126', '\166', '\040', '\151', '\156', '\040', '\061', + '\012', '\132', '\167', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\120', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\125', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\120', '\144', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\121', '\172', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\157', '\125', '\040', '\157', '\156', '\040', '\061', + '\012', '\170', '\112', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\125', '\144', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\167', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\113', '\166', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\121', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\122', '\144', '\153', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\111', '\152', '\040', '\163', '\164', '\040', '\061', + '\012', '\107', '\147', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\116', '\167', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\166', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\161', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\130', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\161', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\155', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\124', '\147', '\144', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\160', '\117', '\040', '\160', '\157', '\040', '\061', + '\012', '\164', '\105', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\102', '\161', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\146', '\114', '\040', '\167', '\141', '\040', '\061', + '\012', '\166', '\131', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\104', '\170', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\127', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\172', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\121', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\124', '\164', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\126', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\122', '\161', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\127', '\143', '\156', '\040', '\143', '\150', '\040', '\061', + '\012', '\116', '\167', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\157', '\112', '\040', '\157', '\156', '\040', '\061', + '\012', '\166', '\104', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\150', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\112', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\120', '\170', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\162', '\106', '\142', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\154', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\153', '\130', '\040', '\153', '\141', '\040', '\061', + '\012', '\156', '\156', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\130', '\146', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\142', '\132', '\040', '\163', '\164', '\040', '\061', + '\012', '\131', '\171', '\146', '\040', '\156', '\171', '\040', '\061', + '\012', '\102', '\152', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\111', '\154', '\170', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\160', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\115', '\161', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\161', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\116', '\166', '\040', '\163', '\164', '\040', '\061', + '\012', '\132', '\166', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\123', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\166', '\102', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\166', '\132', '\040', '\166', '\141', '\040', '\061', + '\012', '\125', '\157', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\106', '\152', '\171', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\113', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\166', '\111', '\040', '\166', '\141', '\040', '\061', + '\012', '\132', '\154', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\144', '\105', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\160', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\154', '\150', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\161', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\152', '\107', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\114', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\160', '\112', '\040', '\160', '\162', '\040', '\061', + '\012', '\167', '\172', '\126', '\040', '\163', '\172', '\040', '\061', + '\012', '\110', '\147', '\161', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\150', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\114', '\166', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\150', '\162', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\165', '\131', '\040', '\165', '\156', '\040', '\061', + '\012', '\152', '\161', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\165', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\106', '\172', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\172', '\107', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\106', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\146', '\105', '\040', '\166', '\141', '\040', '\061', + '\012', '\111', '\147', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\161', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\131', '\142', '\040', '\156', '\147', '\040', '\061', + '\012', '\154', '\112', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\143', '\117', '\040', '\143', '\150', '\040', '\061', + '\012', '\121', '\166', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\124', '\161', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\144', '\131', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\165', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\110', '\167', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\122', '\155', '\040', '\163', '\172', '\040', '\061', + '\012', '\110', '\147', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\120', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\161', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\113', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\160', '\101', '\040', '\160', '\162', '\040', '\061', + '\012', '\142', '\153', '\111', '\040', '\153', '\141', '\040', '\061', + '\012', '\142', '\123', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\170', '\127', '\040', '\155', '\145', '\040', '\061', + '\012', '\155', '\152', '\122', '\040', '\151', '\152', '\040', '\061', + '\012', '\117', '\151', '\160', '\040', '\151', '\156', '\040', '\061', + '\012', '\167', '\171', '\131', '\040', '\167', '\141', '\040', '\061', + '\012', '\144', '\106', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\104', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\130', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\126', '\142', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\152', '\171', '\116', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\166', '\120', '\040', '\166', '\141', '\040', '\061', + '\012', '\171', '\126', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\141', '\127', '\155', '\040', '\141', '\156', '\040', '\061', + '\012', '\107', '\152', '\153', '\040', '\151', '\152', '\040', '\061', + '\012', '\101', '\160', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\132', '\163', '\167', '\040', '\163', '\164', '\040', '\061', + '\012', '\152', '\121', '\166', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\142', '\124', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\144', '\102', '\040', '\144', '\145', '\040', '\061', + '\012', '\153', '\143', '\131', '\040', '\143', '\150', '\040', '\061', + '\012', '\162', '\161', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\170', '\104', '\040', '\142', '\145', '\040', '\061', + '\012', '\166', '\154', '\170', '\040', '\154', '\145', '\040', '\061', + '\012', '\153', '\152', '\112', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\161', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\170', '\105', '\040', '\163', '\172', '\040', '\061', + '\012', '\163', '\110', '\146', '\040', '\163', '\164', '\040', '\061', + '\012', '\152', '\165', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\167', '\130', '\040', '\153', '\141', '\040', '\061', + '\012', '\157', '\161', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\127', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\110', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\110', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\112', '\152', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\142', '\101', '\040', '\142', '\145', '\040', '\061', + '\012', '\122', '\161', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\111', '\152', '\171', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\123', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\126', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\162', '\121', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\155', '\113', '\040', '\155', '\145', '\040', '\061', + '\012', '\146', '\156', '\101', '\040', '\141', '\156', '\040', '\061', + '\012', '\120', '\150', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\150', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\170', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\126', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\161', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\150', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\163', '\106', '\040', '\163', '\164', '\040', '\061', + '\012', '\164', '\131', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\172', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\116', '\146', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\161', '\130', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\112', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\154', '\130', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\132', '\160', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\124', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\160', '\110', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\131', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\142', '\102', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\166', '\105', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\111', '\151', '\040', '\161', '\165', '\040', '\061', + '\012', '\106', '\144', '\153', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\116', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\117', '\146', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\130', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\155', '\166', '\132', '\040', '\166', '\141', '\040', '\061', + '\012', '\103', '\152', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\106', '\155', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\160', '\153', '\122', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\146', '\132', '\040', '\163', '\172', '\040', '\061', + '\012', '\132', '\160', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\143', '\142', '\101', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\166', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\114', '\155', '\160', '\040', '\155', '\145', '\040', '\061', + '\012', '\147', '\106', '\144', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\106', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\106', '\152', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\152', '\106', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\152', '\166', '\040', '\151', '\152', '\040', '\061', + '\012', '\144', '\142', '\124', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\155', '\121', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\106', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\143', '\104', '\153', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\106', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\107', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\150', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\164', '\154', '\040', '\164', '\150', '\040', '\061', + '\012', '\141', '\172', '\126', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\112', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\115', '\170', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\166', '\147', '\113', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\167', '\121', '\040', '\143', '\150', '\040', '\061', + '\012', '\107', '\156', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\154', '\142', '\120', '\040', '\154', '\145', '\040', '\061', + '\012', '\153', '\144', '\123', '\040', '\144', '\145', '\040', '\061', + '\012', '\153', '\104', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\120', '\166', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\110', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\114', '\147', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\155', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\166', '\101', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\125', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\152', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\104', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\170', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\107', '\146', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\142', '\131', '\040', '\156', '\147', '\040', '\061', + '\012', '\123', '\152', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\117', '\147', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\107', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\164', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\167', '\110', '\040', '\156', '\147', '\040', '\061', + '\012', '\115', '\167', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\166', '\125', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\162', '\107', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\115', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\131', '\144', '\166', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\153', '\132', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\152', '\114', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\120', '\170', '\040', '\156', '\171', '\040', '\061', + '\012', '\144', '\162', '\130', '\040', '\145', '\162', '\040', '\061', + '\012', '\152', '\170', '\122', '\040', '\151', '\152', '\040', '\061', + '\012', '\150', '\131', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\110', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\162', '\120', '\040', '\145', '\162', '\040', '\061', + '\012', '\164', '\143', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\112', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\125', '\144', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\130', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\104', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\102', '\152', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\106', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\155', '\170', '\107', '\040', '\155', '\145', '\040', '\061', + '\012', '\170', '\117', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\150', '\147', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\160', '\104', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\150', '\123', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\161', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\116', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\110', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\132', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\152', '\171', '\040', '\151', '\152', '\040', '\061', + '\012', '\124', '\146', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\116', '\167', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\172', '\121', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\122', '\153', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\121', '\166', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\154', '\112', '\040', '\154', '\145', '\040', '\061', + '\012', '\143', '\106', '\160', '\040', '\143', '\150', '\040', '\061', + '\012', '\157', '\104', '\142', '\040', '\157', '\156', '\040', '\061', + '\012', '\154', '\163', '\131', '\040', '\154', '\145', '\040', '\061', + '\012', '\132', '\142', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\103', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\170', '\116', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\121', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\113', '\152', '\171', '\040', '\151', '\152', '\040', '\061', + '\012', '\117', '\166', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\143', '\170', '\101', '\040', '\143', '\150', '\040', '\061', + '\012', '\110', '\161', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\167', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\107', '\166', '\040', '\163', '\164', '\040', '\061', + '\012', '\122', '\167', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\166', '\110', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\126', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\172', '\155', '\130', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\144', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\112', '\166', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\104', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\126', '\150', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\114', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\166', '\103', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\126', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\110', '\146', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\164', '\121', '\154', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\150', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\157', '\161', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\171', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\132', '\146', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\113', '\171', '\040', '\142', '\145', '\040', '\061', + '\012', '\164', '\152', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\153', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\152', '\166', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\147', '\116', '\040', '\156', '\147', '\040', '\061', + '\012', '\154', '\116', '\155', '\040', '\154', '\145', '\040', '\061', + '\012', '\112', '\172', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\114', '\167', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\166', '\143', '\114', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\130', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\164', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\112', '\170', '\040', '\156', '\171', '\040', '\061', + '\012', '\156', '\160', '\126', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\167', '\107', '\040', '\163', '\164', '\040', '\061', + '\012', '\163', '\130', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\145', '\112', '\142', '\040', '\145', '\162', '\040', '\061', + '\012', '\144', '\143', '\122', '\040', '\143', '\150', '\040', '\061', + '\012', '\132', '\162', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\120', '\147', '\166', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\131', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\152', '\154', '\111', '\040', '\154', '\145', '\040', '\061', + '\012', '\106', '\155', '\146', '\040', '\155', '\145', '\040', '\061', + '\012', '\107', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\154', '\132', '\040', '\154', '\145', '\040', '\061', + '\012', '\103', '\163', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\121', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\114', '\155', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\167', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\121', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\146', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\122', '\167', '\040', '\145', '\162', '\040', '\061', + '\012', '\141', '\125', '\157', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\160', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\120', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\110', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\147', '\161', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\127', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\102', '\161', '\040', '\142', '\145', '\040', '\061', + '\012', '\167', '\127', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\143', '\146', '\113', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\127', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\162', '\166', '\126', '\040', '\145', '\162', '\040', '\061', + '\012', '\172', '\150', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\113', '\154', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\142', '\121', '\040', '\143', '\150', '\040', '\061', + '\012', '\112', '\155', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\120', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\121', '\156', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\115', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\141', '\106', '\172', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\112', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\120', '\167', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\143', '\114', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\155', '\121', '\040', '\156', '\147', '\040', '\061', + '\012', '\131', '\161', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\103', '\147', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\161', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\156', '\111', '\040', '\156', '\164', '\040', '\061', + '\012', '\161', '\117', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\171', '\125', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\121', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\125', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\102', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\116', '\155', '\040', '\144', '\145', '\040', '\061', + '\012', '\105', '\167', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\171', '\160', '\104', '\040', '\160', '\162', '\040', '\061', + '\012', '\167', '\170', '\114', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\145', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\153', '\102', '\040', '\153', '\141', '\040', '\061', + '\012', '\152', '\102', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\125', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\121', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\167', '\117', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\121', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\162', '\154', '\040', '\145', '\162', '\040', '\061', + '\012', '\144', '\124', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\127', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\170', '\113', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\110', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\143', '\131', '\040', '\143', '\150', '\040', '\061', + '\012', '\157', '\112', '\163', '\040', '\157', '\156', '\040', '\061', + '\012', '\163', '\122', '\170', '\040', '\163', '\164', '\040', '\061', + '\012', '\165', '\121', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\150', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\144', '\116', '\040', '\163', '\164', '\040', '\061', + '\012', '\155', '\170', '\122', '\040', '\155', '\145', '\040', '\061', + '\012', '\130', '\163', '\166', '\040', '\163', '\164', '\040', '\061', + '\012', '\120', '\143', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\153', '\132', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\104', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\162', '\111', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\156', '\166', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\160', '\101', '\040', '\151', '\152', '\040', '\061', + '\012', '\150', '\132', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\156', '\144', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\132', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\162', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\123', '\142', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\164', '\127', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\160', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\110', '\152', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\143', '\123', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\120', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\110', '\164', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\143', '\107', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\132', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\172', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\113', '\147', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\141', '\125', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\131', '\155', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\143', '\131', '\040', '\143', '\150', '\040', '\061', + '\012', '\157', '\126', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\144', '\115', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\172', '\113', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\162', '\130', '\040', '\145', '\162', '\040', '\061', + '\012', '\171', '\144', '\126', '\040', '\144', '\145', '\040', '\061', + '\012', '\165', '\161', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\155', '\116', '\040', '\155', '\145', '\040', '\061', + '\012', '\117', '\143', '\147', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\114', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\143', '\112', '\163', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\107', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\115', '\153', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\124', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\116', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\110', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\165', '\127', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\170', '\114', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\170', '\107', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\126', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\116', '\142', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\103', '\170', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\143', '\166', '\107', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\103', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\153', '\152', '\103', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\146', '\131', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\143', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\160', '\127', '\040', '\144', '\145', '\040', '\061', + '\012', '\120', '\161', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\154', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\111', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\161', '\170', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\113', '\152', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\132', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\106', '\153', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\147', '\127', '\142', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\161', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\154', '\166', '\040', '\154', '\145', '\040', '\061', + '\012', '\153', '\103', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\167', '\150', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\117', '\167', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\113', '\155', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\161', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\107', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\103', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\155', '\121', '\040', '\155', '\145', '\040', '\061', + '\012', '\170', '\156', '\106', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\165', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\106', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\171', '\123', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\152', '\130', '\040', '\151', '\152', '\040', '\061', + '\012', '\154', '\117', '\152', '\040', '\154', '\145', '\040', '\061', + '\012', '\112', '\155', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\132', '\166', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\161', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\124', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\117', '\151', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\112', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\115', '\152', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\124', '\160', '\142', '\040', '\160', '\162', '\040', '\061', + '\012', '\127', '\164', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\170', '\117', '\040', '\151', '\152', '\040', '\061', + '\012', '\144', '\102', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\164', '\116', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\124', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\156', '\125', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\104', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\123', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\122', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\125', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\102', '\142', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\152', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\111', '\171', '\040', '\163', '\164', '\040', '\061', + '\012', '\144', '\103', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\111', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\132', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\161', '\104', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\162', '\115', '\040', '\145', '\162', '\040', '\061', + '\012', '\165', '\117', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\147', '\117', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\162', '\130', '\040', '\156', '\147', '\040', '\061', + '\012', '\120', '\147', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\126', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\105', '\165', '\040', '\165', '\156', '\040', '\061', + '\012', '\153', '\102', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\123', '\147', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\152', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\117', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\155', '\127', '\040', '\155', '\145', '\040', '\061', + '\012', '\107', '\156', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\132', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\124', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\107', '\146', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\114', '\146', '\040', '\163', '\164', '\040', '\061', + '\012', '\120', '\147', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\167', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\104', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\144', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\163', '\132', '\040', '\163', '\164', '\040', '\061', + '\012', '\166', '\143', '\103', '\040', '\143', '\150', '\040', '\061', + '\012', '\104', '\143', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\125', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\111', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\162', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\142', '\123', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\172', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\127', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\166', '\103', '\040', '\166', '\141', '\040', '\061', + '\012', '\112', '\162', '\167', '\040', '\145', '\162', '\040', '\061', + '\012', '\171', '\170', '\111', '\040', '\156', '\171', '\040', '\061', + '\012', '\144', '\161', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\103', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\130', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\127', '\144', '\160', '\040', '\144', '\145', '\040', '\061', + '\012', '\104', '\172', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\144', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\142', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\167', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\127', '\161', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\151', '\130', '\167', '\040', '\151', '\156', '\040', '\061', + '\012', '\146', '\131', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\165', '\121', '\040', '\165', '\156', '\040', '\061', + '\012', '\153', '\152', '\104', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\111', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\127', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\157', '\103', '\167', '\040', '\157', '\156', '\040', '\061', + '\012', '\132', '\143', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\144', '\116', '\040', '\144', '\145', '\040', '\061', + '\012', '\165', '\131', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\123', '\162', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\160', '\147', '\125', '\040', '\156', '\147', '\040', '\061', + '\012', '\162', '\121', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\110', '\146', '\040', '\155', '\145', '\040', '\061', + '\012', '\146', '\102', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\126', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\131', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\126', '\147', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\141', '\123', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\170', '\127', '\040', '\160', '\162', '\040', '\061', + '\012', '\155', '\156', '\112', '\040', '\141', '\156', '\040', '\061', + '\012', '\102', '\167', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\124', '\161', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\106', '\166', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\167', '\115', '\040', '\167', '\141', '\040', '\061', + '\012', '\104', '\161', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\167', '\111', '\040', '\155', '\145', '\040', '\061', + '\012', '\166', '\150', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\161', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\154', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\141', '\102', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\156', '\132', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\130', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\103', '\152', '\040', '\163', '\164', '\040', '\061', + '\012', '\147', '\162', '\116', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\131', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\167', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\131', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\142', '\164', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\121', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\132', '\154', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\112', '\172', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\142', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\114', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\154', '\170', '\040', '\154', '\145', '\040', '\061', + '\012', '\116', '\155', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\150', '\143', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\162', '\153', '\040', '\145', '\162', '\040', '\061', + '\012', '\116', '\150', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\161', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\152', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\151', '\112', '\144', '\040', '\151', '\156', '\040', '\061', + '\012', '\144', '\114', '\146', '\040', '\144', '\145', '\040', '\061', + '\012', '\143', '\121', '\156', '\040', '\143', '\150', '\040', '\061', + '\012', '\127', '\146', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\150', '\153', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\150', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\115', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\114', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\130', '\147', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\113', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\152', '\112', '\040', '\151', '\152', '\040', '\061', + '\012', '\162', '\112', '\155', '\040', '\145', '\162', '\040', '\061', + '\012', '\126', '\170', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\102', '\170', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\156', '\121', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\153', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\116', '\154', '\167', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\127', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\144', '\125', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\164', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\111', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\145', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\162', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\116', '\150', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\104', '\160', '\040', '\160', '\157', '\040', '\061', + '\012', '\103', '\156', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\170', '\125', '\040', '\153', '\141', '\040', '\061', + '\012', '\102', '\161', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\130', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\153', '\102', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\102', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\115', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\153', '\170', '\122', '\040', '\153', '\141', '\040', '\061', + '\012', '\114', '\172', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\102', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\152', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\160', '\103', '\040', '\160', '\162', '\040', '\061', + '\012', '\146', '\113', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\150', '\167', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\161', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\102', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\143', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\116', '\156', '\163', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\155', '\132', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\113', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\161', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\102', '\152', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\107', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\114', '\156', '\160', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\150', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\120', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\115', '\170', '\040', '\156', '\171', '\040', '\061', + '\012', '\167', '\105', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\155', '\112', '\040', '\153', '\141', '\040', '\061', + '\012', '\121', '\163', '\170', '\040', '\163', '\164', '\040', '\061', + '\012', '\154', '\103', '\167', '\040', '\154', '\145', '\040', '\061', + '\012', '\121', '\161', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\166', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\153', '\116', '\040', '\153', '\141', '\040', '\061', + '\012', '\165', '\126', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\121', '\155', '\040', '\163', '\164', '\040', '\061', + '\012', '\165', '\112', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\172', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\130', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\162', '\111', '\040', '\145', '\162', '\040', '\061', + '\012', '\164', '\102', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\122', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\111', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\152', '\110', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\106', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\167', '\112', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\144', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\113', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\163', '\110', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\102', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\104', '\171', '\040', '\151', '\152', '\040', '\061', + '\012', '\107', '\152', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\106', '\153', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\110', '\150', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\123', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\106', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\166', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\122', '\167', '\040', '\157', '\156', '\040', '\061', + '\012', '\170', '\147', '\130', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\152', '\106', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\104', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\143', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\143', '\167', '\040', '\143', '\150', '\040', '\061', + '\012', '\156', '\146', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\107', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\107', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\170', '\126', '\040', '\146', '\157', '\040', '\061', + '\012', '\151', '\120', '\152', '\040', '\151', '\156', '\040', '\061', + '\012', '\161', '\147', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\111', '\166', '\040', '\151', '\152', '\040', '\061', + '\012', '\126', '\150', '\165', '\040', '\164', '\150', '\040', '\061', + '\012', '\102', '\172', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\112', '\166', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\126', '\152', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\124', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\104', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\131', '\163', '\166', '\040', '\163', '\164', '\040', '\061', + '\012', '\172', '\164', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\164', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\106', '\171', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\161', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\163', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\152', '\123', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\130', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\160', '\113', '\040', '\160', '\162', '\040', '\061', + '\012', '\156', '\104', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\113', '\170', '\040', '\163', '\164', '\040', '\061', + '\012', '\170', '\131', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\132', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\160', '\170', '\146', '\040', '\160', '\162', '\040', '\061', + '\012', '\152', '\161', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\124', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\116', '\153', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\160', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\105', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\161', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\110', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\104', '\153', '\160', '\040', '\153', '\141', '\040', '\061', + '\012', '\143', '\161', '\131', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\161', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\126', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\120', '\170', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\170', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\124', '\146', '\040', '\156', '\171', '\040', '\061', + '\012', '\167', '\103', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\121', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\146', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\171', '\121', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\147', '\125', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\163', '\121', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\107', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\167', '\113', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\167', '\167', '\102', '\040', '\167', '\141', '\040', '\061', + '\012', '\166', '\106', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\167', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\162', '\102', '\040', '\141', '\156', '\040', '\061', + '\012', '\154', '\160', '\131', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\154', '\122', '\040', '\154', '\145', '\040', '\061', + '\012', '\146', '\144', '\113', '\040', '\144', '\145', '\040', '\061', + '\012', '\145', '\106', '\172', '\040', '\145', '\162', '\040', '\061', + '\012', '\152', '\171', '\121', '\040', '\151', '\152', '\040', '\061', + '\012', '\154', '\167', '\124', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\103', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\143', '\147', '\115', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\164', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\141', '\161', '\112', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\130', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\144', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\170', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\143', '\123', '\040', '\143', '\150', '\040', '\061', + '\012', '\156', '\155', '\126', '\040', '\141', '\156', '\040', '\061', + '\012', '\162', '\121', '\144', '\040', '\145', '\162', '\040', '\061', + '\012', '\107', '\154', '\153', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\105', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\166', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\166', '\106', '\040', '\163', '\164', '\040', '\061', + '\012', '\163', '\112', '\170', '\040', '\163', '\164', '\040', '\061', + '\012', '\121', '\171', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\130', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\164', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\107', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\132', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\105', '\166', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\172', '\104', '\040', '\163', '\172', '\040', '\061', + '\012', '\165', '\146', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\120', '\170', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\144', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\113', '\172', '\040', '\145', '\162', '\040', '\061', + '\012', '\112', '\150', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\103', '\170', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\170', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\124', '\154', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\107', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\131', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\105', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\172', '\125', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\127', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\127', '\142', '\040', '\145', '\162', '\040', '\061', + '\012', '\127', '\162', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\163', '\114', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\112', '\160', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\153', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\166', '\147', '\105', '\040', '\156', '\147', '\040', '\061', + '\012', '\102', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\121', '\163', '\040', '\157', '\156', '\040', '\061', + '\012', '\153', '\142', '\132', '\040', '\153', '\141', '\040', '\061', + '\012', '\162', '\126', '\146', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\114', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\162', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\163', '\122', '\040', '\163', '\164', '\040', '\061', + '\012', '\150', '\167', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\156', '\153', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\120', '\172', '\040', '\143', '\150', '\040', '\061', + '\012', '\125', '\143', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\145', '\147', '\112', '\040', '\156', '\147', '\040', '\061', + '\012', '\121', '\171', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\167', '\162', '\040', '\160', '\162', '\040', '\061', + '\012', '\170', '\146', '\104', '\040', '\146', '\157', '\040', '\061', + '\012', '\167', '\171', '\110', '\040', '\167', '\141', '\040', '\061', + '\012', '\154', '\102', '\167', '\040', '\154', '\145', '\040', '\061', + '\012', '\115', '\144', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\121', '\163', '\171', '\040', '\163', '\164', '\040', '\061', + '\012', '\172', '\161', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\160', '\131', '\040', '\166', '\141', '\040', '\061', + '\012', '\163', '\154', '\131', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\147', '\114', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\156', '\116', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\126', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\113', '\170', '\040', '\156', '\171', '\040', '\061', + '\012', '\142', '\144', '\127', '\040', '\144', '\145', '\040', '\061', + '\012', '\154', '\161', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\150', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\116', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\112', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\111', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\110', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\171', '\162', '\112', '\040', '\145', '\162', '\040', '\061', + '\012', '\154', '\162', '\122', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\172', '\131', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\147', '\102', '\040', '\160', '\162', '\040', '\061', + '\012', '\155', '\146', '\103', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\153', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\125', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\103', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\154', '\116', '\040', '\154', '\145', '\040', '\061', + '\012', '\102', '\147', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\143', '\105', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\122', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\150', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\145', '\107', '\172', '\040', '\145', '\162', '\040', '\061', + '\012', '\106', '\160', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\166', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\155', '\102', '\146', '\040', '\155', '\145', '\040', '\061', + '\012', '\150', '\150', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\157', '\125', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\170', '\121', '\040', '\144', '\145', '\040', '\061', + '\012', '\127', '\150', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\115', '\153', '\040', '\145', '\162', '\040', '\061', + '\012', '\154', '\127', '\144', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\127', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\157', '\121', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\127', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\156', '\165', '\126', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\127', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\166', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\167', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\155', '\112', '\040', '\163', '\164', '\040', '\061', + '\012', '\110', '\154', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\112', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\155', '\131', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\132', '\156', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\152', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\112', '\150', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\161', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\143', '\117', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\161', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\102', '\146', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\153', '\126', '\040', '\153', '\141', '\040', '\061', + '\012', '\164', '\102', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\153', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\113', '\161', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\127', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\130', '\171', '\040', '\154', '\145', '\040', '\061', + '\012', '\171', '\122', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\155', '\152', '\110', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\172', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\170', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\166', '\155', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\143', '\115', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\113', '\166', '\040', '\153', '\141', '\040', '\061', + '\012', '\171', '\157', '\130', '\040', '\160', '\157', '\040', '\061', + '\012', '\170', '\162', '\124', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\127', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\161', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\127', '\152', '\040', '\163', '\164', '\040', '\061', + '\012', '\123', '\144', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\146', '\122', '\040', '\144', '\145', '\040', '\061', + '\012', '\113', '\161', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\107', '\152', '\144', '\040', '\144', '\157', '\040', '\061', + '\012', '\121', '\142', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\171', '\113', '\040', '\156', '\171', '\040', '\061', + '\012', '\170', '\155', '\130', '\040', '\155', '\145', '\040', '\061', + '\012', '\170', '\165', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\126', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\157', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\154', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\115', '\153', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\114', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\147', '\115', '\162', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\103', '\160', '\040', '\163', '\164', '\040', '\061', + '\012', '\142', '\107', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\130', '\157', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\124', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\153', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\124', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\116', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\130', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\143', '\132', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\126', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\111', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\161', '\156', '\110', '\040', '\141', '\156', '\040', '\061', + '\012', '\156', '\167', '\103', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\123', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\157', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\104', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\144', '\125', '\040', '\144', '\145', '\040', '\061', + '\012', '\130', '\155', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\153', '\116', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\131', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\131', '\147', '\160', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\154', '\112', '\040', '\154', '\145', '\040', '\061', + '\012', '\155', '\106', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\123', '\170', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\106', '\172', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\124', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\111', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\141', '\152', '\131', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\131', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\162', '\113', '\142', '\040', '\145', '\162', '\040', '\061', + '\012', '\160', '\172', '\102', '\040', '\163', '\172', '\040', '\061', + '\012', '\145', '\111', '\171', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\146', '\113', '\040', '\167', '\141', '\040', '\061', + '\012', '\106', '\155', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\146', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\154', '\155', '\040', '\154', '\145', '\040', '\061', + '\012', '\103', '\172', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\154', '\120', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\161', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\106', '\171', '\040', '\167', '\141', '\040', '\061', + '\012', '\142', '\121', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\126', '\167', '\040', '\153', '\141', '\040', '\061', + '\012', '\156', '\115', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\103', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\157', '\145', '\105', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\110', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\146', '\116', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\155', '\130', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\116', '\153', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\127', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\106', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\113', '\146', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\142', '\147', '\131', '\040', '\156', '\147', '\040', '\061', + '\012', '\154', '\131', '\172', '\040', '\154', '\145', '\040', '\061', + '\012', '\143', '\147', '\104', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\147', '\115', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\150', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\162', '\104', '\040', '\145', '\162', '\040', '\061', + '\012', '\152', '\167', '\101', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\171', '\115', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\172', '\103', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\121', '\144', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\143', '\110', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\142', '\130', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\172', '\107', '\040', '\163', '\172', '\040', '\061', + '\012', '\155', '\123', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\131', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\161', '\147', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\131', '\153', '\040', '\151', '\152', '\040', '\061', + '\012', '\144', '\111', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\160', '\107', '\040', '\160', '\162', '\040', '\061', + '\012', '\150', '\126', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\124', '\152', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\166', '\120', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\132', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\106', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\146', '\125', '\040', '\153', '\141', '\040', '\061', + '\012', '\123', '\170', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\167', '\106', '\040', '\167', '\141', '\040', '\061', + '\012', '\121', '\167', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\127', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\152', '\161', '\121', '\040', '\151', '\152', '\040', '\061', + '\012', '\126', '\146', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\143', '\112', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\167', '\112', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\102', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\104', '\144', '\155', '\040', '\144', '\145', '\040', '\061', + '\012', '\142', '\127', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\160', '\107', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\162', '\121', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\143', '\123', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\110', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\111', '\171', '\040', '\164', '\150', '\040', '\061', + '\012', '\131', '\170', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\163', '\144', '\103', '\040', '\163', '\164', '\040', '\061', + '\012', '\171', '\126', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\152', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\124', '\172', '\171', '\040', '\163', '\172', '\040', '\061', + '\012', '\106', '\146', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\172', '\130', '\040', '\163', '\172', '\040', '\061', + '\012', '\110', '\144', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\147', '\114', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\131', '\161', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\114', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\154', '\121', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\152', '\107', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\160', '\114', '\040', '\160', '\162', '\040', '\061', + '\012', '\143', '\112', '\162', '\040', '\143', '\150', '\040', '\061', + '\012', '\141', '\112', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\131', '\156', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\127', '\166', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\113', '\171', '\040', '\154', '\145', '\040', '\061', + '\012', '\145', '\131', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\170', '\114', '\040', '\153', '\141', '\040', '\061', + '\012', '\147', '\103', '\142', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\122', '\144', '\040', '\163', '\164', '\040', '\061', + '\012', '\162', '\115', '\144', '\040', '\145', '\162', '\040', '\061', + '\012', '\102', '\166', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\113', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\154', '\113', '\040', '\154', '\145', '\040', '\061', + '\012', '\155', '\104', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\153', '\112', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\122', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\154', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\122', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\166', '\116', '\040', '\166', '\141', '\040', '\061', + '\012', '\156', '\170', '\111', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\103', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\131', '\142', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\105', '\142', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\153', '\116', '\040', '\153', '\141', '\040', '\061', + '\012', '\142', '\121', '\171', '\040', '\142', '\145', '\040', '\061', + '\012', '\162', '\104', '\167', '\040', '\145', '\162', '\040', '\061', + '\012', '\144', '\152', '\112', '\040', '\144', '\145', '\040', '\061', + '\012', '\164', '\155', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\167', '\110', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\112', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\143', '\115', '\040', '\143', '\150', '\040', '\061', + '\012', '\157', '\172', '\126', '\040', '\157', '\156', '\040', '\061', + '\012', '\155', '\114', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\142', '\113', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\145', '\132', '\146', '\040', '\145', '\162', '\040', '\061', + '\012', '\106', '\150', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\143', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\114', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\161', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\130', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\164', '\147', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\121', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\104', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\157', '\104', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\147', '\115', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\156', '\104', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\110', '\160', '\040', '\156', '\147', '\040', '\061', + '\012', '\127', '\153', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\111', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\114', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\164', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\144', '\121', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\103', '\155', '\040', '\157', '\167', '\040', '\061', + '\012', '\166', '\126', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\112', '\155', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\150', '\142', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\162', '\127', '\040', '\145', '\162', '\040', '\061', + '\012', '\156', '\170', '\116', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\126', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\165', '\127', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\147', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\102', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\125', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\146', '\154', '\110', '\040', '\154', '\145', '\040', '\061', + '\012', '\171', '\127', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\152', '\116', '\040', '\151', '\152', '\040', '\061', + '\012', '\125', '\167', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\156', '\131', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\164', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\120', '\147', '\160', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\106', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\157', '\130', '\172', '\040', '\157', '\156', '\040', '\061', + '\012', '\151', '\103', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\114', '\160', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\107', '\161', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\131', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\161', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\150', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\155', '\106', '\040', '\163', '\172', '\040', '\061', + '\012', '\102', '\160', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\112', '\146', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\130', '\166', '\040', '\157', '\156', '\040', '\061', + '\012', '\154', '\147', '\130', '\040', '\156', '\147', '\040', '\061', + '\012', '\112', '\146', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\172', '\160', '\123', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\143', '\117', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\167', '\121', '\040', '\167', '\141', '\040', '\061', + '\012', '\160', '\153', '\121', '\040', '\153', '\141', '\040', '\061', + '\012', '\167', '\117', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\127', '\147', '\155', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\117', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\116', '\146', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\161', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\163', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\144', '\110', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\122', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\153', '\130', '\040', '\153', '\141', '\040', '\061', + '\012', '\143', '\104', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\146', '\125', '\040', '\155', '\145', '\040', '\061', + '\012', '\170', '\172', '\115', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\107', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\165', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\161', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\124', '\161', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\166', '\104', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\127', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\106', '\172', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\161', '\160', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\171', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\121', '\145', '\040', '\156', '\147', '\040', '\061', + '\012', '\132', '\155', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\131', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\166', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\141', '\121', '\154', '\040', '\141', '\156', '\040', '\061', + '\012', '\157', '\161', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\145', '\161', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\166', '\124', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\125', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\151', '\142', '\110', '\040', '\151', '\156', '\040', '\061', + '\012', '\152', '\166', '\132', '\040', '\151', '\152', '\040', '\061', + '\012', '\127', '\167', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\147', '\131', '\040', '\156', '\147', '\040', '\061', + '\012', '\145', '\106', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\130', '\147', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\131', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\153', '\132', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\166', '\160', '\104', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\143', '\132', '\040', '\143', '\150', '\040', '\061', + '\012', '\102', '\161', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\114', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\162', '\167', '\130', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\171', '\113', '\040', '\156', '\171', '\040', '\061', + '\012', '\123', '\170', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\163', '\170', '\132', '\040', '\163', '\164', '\040', '\061', + '\012', '\167', '\153', '\113', '\040', '\153', '\141', '\040', '\061', + '\012', '\171', '\112', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\164', '\152', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\120', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\132', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\122', '\162', '\155', '\040', '\145', '\162', '\040', '\061', + '\012', '\156', '\150', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\161', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\170', '\131', '\040', '\156', '\171', '\040', '\061', + '\012', '\166', '\163', '\105', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\153', '\113', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\165', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\121', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\130', '\166', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\155', '\115', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\117', '\161', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\104', '\170', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\114', '\161', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\127', '\156', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\155', '\107', '\040', '\151', '\152', '\040', '\061', + '\012', '\127', '\161', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\150', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\147', '\132', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\155', '\117', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\106', '\155', '\040', '\163', '\172', '\040', '\061', + '\012', '\113', '\150', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\161', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\126', '\166', '\040', '\141', '\156', '\040', '\061', + '\012', '\122', '\146', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\155', '\114', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\144', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\127', '\160', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\166', '\117', '\040', '\166', '\141', '\040', '\061', + '\012', '\144', '\131', '\160', '\040', '\144', '\145', '\040', '\061', + '\012', '\157', '\150', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\157', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\152', '\102', '\040', '\145', '\162', '\040', '\061', + '\012', '\104', '\167', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\141', '\127', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\154', '\104', '\040', '\143', '\150', '\040', '\061', + '\012', '\126', '\144', '\153', '\040', '\144', '\145', '\040', '\061', + '\012', '\164', '\167', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\132', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\121', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\144', '\167', '\104', '\040', '\144', '\145', '\040', '\061', + '\012', '\151', '\131', '\166', '\040', '\151', '\156', '\040', '\061', + '\012', '\101', '\167', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\147', '\107', '\040', '\156', '\147', '\040', '\061', + '\012', '\130', '\157', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\162', '\121', '\040', '\145', '\162', '\040', '\061', + '\012', '\126', '\170', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\154', '\167', '\102', '\040', '\154', '\145', '\040', '\061', + '\012', '\120', '\170', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\112', '\167', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\172', '\114', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\164', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\167', '\131', '\040', '\160', '\162', '\040', '\061', + '\012', '\115', '\152', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\130', '\162', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\130', '\165', '\040', '\165', '\156', '\040', '\061', + '\012', '\105', '\161', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\102', '\160', '\171', '\040', '\160', '\162', '\040', '\061', + '\012', '\172', '\156', '\131', '\040', '\141', '\156', '\040', '\061', + '\012', '\122', '\161', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\121', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\132', '\166', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\152', '\117', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\116', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\154', '\111', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\115', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\161', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\115', '\146', '\040', '\154', '\145', '\040', '\061', + '\012', '\112', '\161', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\126', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\166', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\145', '\110', '\153', '\040', '\145', '\162', '\040', '\061', + '\012', '\152', '\142', '\113', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\127', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\124', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\156', '\106', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\170', '\117', '\040', '\156', '\171', '\040', '\061', + '\012', '\106', '\161', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\106', '\142', '\040', '\141', '\156', '\040', '\061', + '\012', '\157', '\104', '\160', '\040', '\157', '\156', '\040', '\061', + '\012', '\152', '\125', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\110', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\107', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\120', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\110', '\166', '\040', '\151', '\152', '\040', '\061', + '\012', '\111', '\167', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\172', '\126', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\125', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\121', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\106', '\142', '\040', '\163', '\164', '\040', '\061', + '\012', '\114', '\166', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\124', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\166', '\113', '\040', '\166', '\141', '\040', '\061', + '\012', '\103', '\143', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\171', '\101', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\105', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\144', '\107', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\161', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\142', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\110', '\144', '\040', '\141', '\156', '\040', '\061', + '\012', '\110', '\150', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\126', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\165', '\110', '\167', '\040', '\165', '\156', '\040', '\061', + '\012', '\132', '\143', '\153', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\120', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\170', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\110', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\104', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\164', '\154', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\114', '\163', '\166', '\040', '\163', '\164', '\040', '\061', + '\012', '\172', '\166', '\106', '\040', '\166', '\141', '\040', '\061', + '\012', '\155', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\161', '\106', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\147', '\115', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\171', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\162', '\112', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\123', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\115', '\155', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\103', '\147', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\122', '\154', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\155', '\166', '\107', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\165', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\126', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\115', '\172', '\040', '\163', '\164', '\040', '\061', + '\012', '\167', '\127', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\160', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\121', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\102', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\143', '\127', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\170', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\146', '\113', '\040', '\145', '\162', '\040', '\061', + '\012', '\155', '\106', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\121', '\156', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\152', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\122', '\153', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\163', '\162', '\105', '\040', '\145', '\162', '\040', '\061', + '\012', '\144', '\162', '\107', '\040', '\145', '\162', '\040', '\061', + '\012', '\103', '\146', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\171', '\132', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\127', '\170', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\172', '\103', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\132', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\116', '\161', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\147', '\117', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\127', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\162', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\116', '\172', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\110', '\152', '\171', '\040', '\151', '\152', '\040', '\061', + '\012', '\125', '\170', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\157', '\111', '\171', '\040', '\157', '\156', '\040', '\061', + '\012', '\162', '\146', '\130', '\040', '\145', '\162', '\040', '\061', + '\012', '\157', '\102', '\167', '\040', '\157', '\156', '\040', '\061', + '\012', '\171', '\171', '\126', '\040', '\156', '\171', '\040', '\061', + '\012', '\121', '\151', '\166', '\040', '\151', '\156', '\040', '\061', + '\012', '\144', '\113', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\104', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\147', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\116', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\144', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\166', '\131', '\040', '\157', '\156', '\040', '\061', + '\012', '\146', '\142', '\132', '\040', '\142', '\145', '\040', '\061', + '\012', '\161', '\151', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\166', '\124', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\131', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\142', '\113', '\040', '\153', '\141', '\040', '\061', + '\012', '\115', '\146', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\122', '\160', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\160', '\110', '\142', '\040', '\160', '\162', '\040', '\061', + '\012', '\161', '\161', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\153', '\126', '\040', '\153', '\141', '\040', '\061', + '\012', '\163', '\127', '\160', '\040', '\163', '\164', '\040', '\061', + '\012', '\153', '\120', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\114', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\157', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\114', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\150', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\160', '\114', '\040', '\160', '\162', '\040', '\061', + '\012', '\124', '\161', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\172', '\107', '\040', '\163', '\172', '\040', '\061', + '\012', '\153', '\143', '\124', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\152', '\130', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\120', '\171', '\040', '\153', '\165', '\040', '\061', + '\012', '\146', '\144', '\102', '\040', '\144', '\145', '\040', '\061', + '\012', '\121', '\170', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\147', '\131', '\146', '\040', '\156', '\147', '\040', '\061', + '\012', '\131', '\160', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\172', '\123', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\104', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\142', '\112', '\040', '\142', '\145', '\040', '\061', + '\012', '\171', '\146', '\117', '\040', '\156', '\171', '\040', '\061', + '\012', '\165', '\121', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\160', '\121', '\040', '\160', '\162', '\040', '\061', + '\012', '\144', '\130', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\167', '\120', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\124', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\112', '\154', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\103', '\161', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\127', '\171', '\040', '\142', '\145', '\040', '\061', + '\012', '\143', '\125', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\131', '\142', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\167', '\171', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\150', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\125', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\116', '\143', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\115', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\132', '\171', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\143', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\121', '\163', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\114', '\150', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\107', '\143', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\121', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\131', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\131', '\155', '\040', '\144', '\145', '\040', '\061', + '\012', '\121', '\166', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\122', '\143', '\147', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\107', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\170', '\112', '\040', '\142', '\145', '\040', '\061', + '\012', '\152', '\106', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\114', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\154', '\104', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\161', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\111', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\102', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\121', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\172', '\112', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\146', '\112', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\124', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\142', '\130', '\040', '\153', '\141', '\040', '\061', + '\012', '\110', '\154', '\172', '\040', '\154', '\145', '\040', '\061', + '\012', '\160', '\165', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\113', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\102', '\142', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\160', '\127', '\040', '\166', '\141', '\040', '\061', + '\012', '\131', '\152', '\153', '\040', '\151', '\152', '\040', '\061', + '\012', '\127', '\156', '\155', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\132', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\154', '\144', '\132', '\040', '\154', '\145', '\040', '\061', + '\012', '\147', '\115', '\155', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\132', '\146', '\040', '\160', '\151', '\040', '\061', + '\012', '\145', '\131', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\124', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\107', '\153', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\103', '\147', '\171', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\104', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\170', '\127', '\040', '\156', '\147', '\040', '\061', + '\012', '\103', '\167', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\150', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\166', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\156', '\146', '\110', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\143', '\127', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\147', '\103', '\040', '\156', '\147', '\040', '\061', + '\012', '\104', '\146', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\166', '\160', '\112', '\040', '\166', '\141', '\040', '\061', + '\012', '\127', '\160', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\163', '\103', '\142', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\147', '\106', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\120', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\157', '\103', '\160', '\040', '\157', '\156', '\040', '\061', + '\012', '\116', '\162', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\110', '\167', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\146', '\122', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\141', '\145', '\130', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\144', '\111', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\102', '\166', '\040', '\163', '\164', '\040', '\061', + '\012', '\166', '\117', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\121', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\155', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\120', '\161', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\150', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\153', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\150', '\142', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\172', '\106', '\040', '\163', '\172', '\040', '\061', + '\012', '\131', '\142', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\163', '\130', '\142', '\040', '\163', '\164', '\040', '\061', + '\012', '\171', '\121', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\150', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\147', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\130', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\116', '\170', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\141', '\117', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\146', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\121', '\170', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\161', '\167', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\152', '\126', '\040', '\151', '\152', '\040', '\061', + '\012', '\150', '\152', '\131', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\164', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\147', '\125', '\040', '\156', '\147', '\040', '\061', + '\012', '\156', '\115', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\116', '\167', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\166', '\120', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\130', '\146', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\106', '\146', '\040', '\156', '\171', '\040', '\061', + '\012', '\146', '\110', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\156', '\132', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\120', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\147', '\142', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\102', '\142', '\040', '\142', '\151', '\040', '\061', + '\012', '\163', '\152', '\117', '\040', '\163', '\164', '\040', '\061', + '\012', '\167', '\104', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\156', '\152', '\116', '\040', '\141', '\156', '\040', '\061', + '\012', '\157', '\150', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\161', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\106', '\172', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\162', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\152', '\107', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\106', '\166', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\121', '\144', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\142', '\105', '\040', '\166', '\151', '\040', '\061', + '\012', '\125', '\152', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\111', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\106', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\166', '\131', '\040', '\166', '\141', '\040', '\061', + '\012', '\123', '\172', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\154', '\110', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\143', '\131', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\105', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\150', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\126', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\146', '\110', '\040', '\142', '\145', '\040', '\061', + '\012', '\116', '\162', '\172', '\040', '\145', '\162', '\040', '\061', + '\012', '\163', '\112', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\127', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\156', '\166', '\113', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\151', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\142', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\170', '\102', '\040', '\166', '\141', '\040', '\061', + '\012', '\164', '\166', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\116', '\162', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\131', '\170', '\040', '\154', '\145', '\040', '\061', + '\012', '\164', '\153', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\107', '\172', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\103', '\170', '\040', '\166', '\151', '\040', '\061', + '\012', '\132', '\142', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\127', '\160', '\040', '\155', '\145', '\040', '\061', + '\012', '\104', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\146', '\105', '\040', '\160', '\162', '\040', '\061', + '\012', '\150', '\166', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\105', '\157', '\170', '\040', '\157', '\156', '\040', '\061', + '\012', '\144', '\142', '\132', '\040', '\144', '\145', '\040', '\061', + '\012', '\154', '\116', '\142', '\040', '\154', '\145', '\040', '\061', + '\012', '\162', '\124', '\144', '\040', '\145', '\162', '\040', '\061', + '\012', '\154', '\152', '\121', '\040', '\154', '\145', '\040', '\061', + '\012', '\126', '\166', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\112', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\165', '\161', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\152', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\104', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\147', '\121', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\153', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\112', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\144', '\111', '\040', '\144', '\145', '\040', '\061', + '\012', '\107', '\143', '\160', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\130', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\121', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\147', '\105', '\040', '\156', '\147', '\040', '\061', + '\012', '\113', '\172', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\120', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\110', '\143', '\172', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\152', '\121', '\040', '\144', '\145', '\040', '\061', + '\012', '\160', '\107', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\171', '\105', '\040', '\156', '\171', '\040', '\061', + '\012', '\144', '\102', '\142', '\040', '\144', '\145', '\040', '\061', + '\012', '\145', '\120', '\152', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\147', '\117', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\122', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\161', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\113', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\170', '\155', '\131', '\040', '\155', '\145', '\040', '\061', + '\012', '\150', '\147', '\117', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\144', '\107', '\040', '\144', '\145', '\040', '\061', + '\012', '\150', '\166', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\162', '\106', '\040', '\145', '\162', '\040', '\061', + '\012', '\102', '\166', '\146', '\040', '\166', '\151', '\040', '\061', + '\012', '\171', '\166', '\104', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\126', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\131', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\161', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\145', '\106', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\167', '\132', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\161', '\107', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\113', '\160', '\040', '\163', '\164', '\040', '\061', + '\012', '\150', '\112', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\114', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\150', '\144', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\143', '\116', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\116', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\154', '\113', '\040', '\154', '\145', '\040', '\061', + '\012', '\162', '\112', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\141', '\116', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\113', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\163', '\116', '\146', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\120', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\172', '\114', '\040', '\163', '\172', '\040', '\061', + '\012', '\112', '\144', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\156', '\122', '\142', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\116', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\164', '\156', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\156', '\111', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\132', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\132', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\167', '\115', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\117', '\156', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\111', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\166', '\110', '\040', '\166', '\141', '\040', '\061', + '\012', '\125', '\166', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\170', '\112', '\040', '\163', '\172', '\040', '\061', + '\012', '\126', '\155', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\120', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\167', '\104', '\040', '\155', '\145', '\040', '\061', + '\012', '\152', '\121', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\120', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\146', '\126', '\040', '\166', '\141', '\040', '\061', + '\012', '\124', '\161', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\112', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\154', '\167', '\117', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\142', '\107', '\040', '\167', '\141', '\040', '\061', + '\012', '\146', '\124', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\130', '\164', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\172', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\120', '\172', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\120', '\155', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\170', '\132', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\152', '\103', '\160', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\113', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\124', '\155', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\110', '\156', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\152', '\130', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\147', '\110', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\123', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\171', '\154', '\116', '\040', '\154', '\145', '\040', '\061', + '\012', '\147', '\166', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\124', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\127', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\167', '\102', '\040', '\167', '\141', '\040', '\061', + '\012', '\142', '\103', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\116', '\153', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\103', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\170', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\156', '\124', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\106', '\163', '\040', '\156', '\147', '\040', '\061', + '\012', '\130', '\167', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\112', '\154', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\143', '\122', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\142', '\124', '\040', '\142', '\145', '\040', '\061', + '\012', '\106', '\143', '\144', '\040', '\143', '\150', '\040', '\061', + '\012', '\127', '\170', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\167', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\123', '\146', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\143', '\113', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\142', '\126', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\123', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\154', '\142', '\102', '\040', '\154', '\145', '\040', '\061', + '\012', '\117', '\143', '\167', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\147', '\115', '\040', '\156', '\147', '\040', '\061', + '\012', '\156', '\142', '\111', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\163', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\171', '\146', '\040', '\156', '\171', '\040', '\061', + '\012', '\160', '\170', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\155', '\122', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\117', '\147', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\165', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\130', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\142', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\124', '\142', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\172', '\162', '\122', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\155', '\120', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\103', '\155', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\164', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\150', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\152', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\147', '\107', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\106', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\162', '\161', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\123', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\142', '\113', '\040', '\142', '\145', '\040', '\061', + '\012', '\155', '\161', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\162', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\144', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\143', '\107', '\040', '\143', '\150', '\040', '\061', + '\012', '\151', '\106', '\142', '\040', '\151', '\156', '\040', '\061', + '\012', '\155', '\143', '\132', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\103', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\110', '\172', '\040', '\164', '\172', '\040', '\061', + '\012', '\150', '\152', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\164', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\155', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\154', '\104', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\122', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\103', '\144', '\040', '\156', '\147', '\040', '\061', + '\012', '\130', '\170', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\113', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\111', '\167', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\163', '\131', '\040', '\163', '\164', '\040', '\061', + '\012', '\170', '\162', '\112', '\040', '\145', '\162', '\040', '\061', + '\012', '\164', '\116', '\163', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\142', '\104', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\114', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\106', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\116', '\170', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\146', '\122', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\112', '\162', '\142', '\040', '\145', '\162', '\040', '\061', + '\012', '\152', '\105', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\167', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\126', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\147', '\116', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\101', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\120', '\152', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\156', '\160', '\120', '\040', '\151', '\156', '\040', '\061', + '\012', '\112', '\143', '\171', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\112', '\142', '\040', '\142', '\151', '\040', '\061', + '\012', '\152', '\170', '\111', '\040', '\151', '\152', '\040', '\061', + '\012', '\113', '\153', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\167', '\126', '\040', '\153', '\141', '\040', '\061', + '\012', '\147', '\122', '\146', '\040', '\156', '\147', '\040', '\061', + '\012', '\127', '\146', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\124', '\144', '\160', '\040', '\160', '\157', '\040', '\061', + '\012', '\167', '\105', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\114', '\166', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\104', '\161', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\161', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\112', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\144', '\103', '\040', '\144', '\145', '\040', '\061', + '\012', '\150', '\170', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\125', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\164', '\121', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\114', '\172', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\124', '\152', '\040', '\144', '\145', '\040', '\061', + '\012', '\124', '\154', '\172', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\121', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\106', '\143', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\147', '\105', '\040', '\156', '\147', '\040', '\061', + '\012', '\103', '\153', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\113', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\170', '\167', '\123', '\040', '\167', '\141', '\040', '\061', + '\012', '\167', '\122', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\153', '\113', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\121', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\114', '\160', '\040', '\163', '\164', '\040', '\061', + '\012', '\152', '\101', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\144', '\155', '\107', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\113', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\125', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\130', '\171', '\040', '\167', '\141', '\040', '\061', + '\012', '\142', '\172', '\112', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\172', '\112', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\116', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\147', '\131', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\150', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\141', '\146', '\130', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\132', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\130', '\144', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\124', '\144', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\116', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\130', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\143', '\105', '\040', '\143', '\150', '\040', '\061', + '\012', '\115', '\156', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\104', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\124', '\144', '\152', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\147', '\112', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\144', '\122', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\107', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\115', '\152', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\163', '\170', '\110', '\040', '\163', '\164', '\040', '\061', + '\012', '\120', '\160', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\146', '\126', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\117', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\116', '\166', '\170', '\040', '\166', '\151', '\040', '\061', + '\012', '\161', '\141', '\126', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\152', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\147', '\132', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\107', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\132', '\170', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\115', '\146', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\172', '\106', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\147', '\112', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\160', '\107', '\040', '\160', '\162', '\040', '\061', + '\012', '\166', '\113', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\161', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\147', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\121', '\171', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\152', '\155', '\111', '\040', '\151', '\152', '\040', '\061', + '\012', '\126', '\147', '\144', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\103', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\126', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\165', '\105', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\143', '\116', '\040', '\143', '\150', '\040', '\061', + '\012', '\102', '\172', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\126', '\154', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\130', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\121', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\154', '\162', '\131', '\040', '\145', '\162', '\040', '\061', + '\012', '\126', '\164', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\110', '\163', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\152', '\116', '\040', '\151', '\152', '\040', '\061', + '\012', '\162', '\172', '\112', '\040', '\145', '\162', '\040', '\061', + '\012', '\163', '\131', '\171', '\040', '\163', '\164', '\040', '\061', + '\012', '\167', '\170', '\121', '\040', '\167', '\141', '\040', '\061', + '\012', '\132', '\164', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\127', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\103', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\141', '\106', '\142', '\040', '\141', '\156', '\040', '\061', + '\012', '\154', '\161', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\145', '\132', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\120', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\152', '\131', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\113', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\150', '\171', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\103', '\152', '\040', '\144', '\145', '\040', '\061', + '\012', '\142', '\153', '\110', '\040', '\153', '\141', '\040', '\061', + '\012', '\171', '\152', '\104', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\124', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\150', '\170', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\166', '\113', '\040', '\166', '\151', '\040', '\061', + '\012', '\114', '\167', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\163', '\167', '\121', '\040', '\163', '\164', '\040', '\061', + '\012', '\144', '\124', '\153', '\040', '\144', '\151', '\040', '\061', + '\012', '\146', '\163', '\117', '\040', '\163', '\164', '\040', '\061', + '\012', '\154', '\152', '\105', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\152', '\115', '\040', '\151', '\152', '\040', '\061', + '\012', '\165', '\121', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\120', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\155', '\103', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\163', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\104', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\112', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\132', '\160', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\150', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\116', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\127', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\106', '\167', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\110', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\106', '\156', '\166', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\144', '\114', '\040', '\144', '\145', '\040', '\061', + '\012', '\157', '\161', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\141', '\131', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\126', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\113', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\103', '\142', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\166', '\171', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\161', '\132', '\040', '\143', '\150', '\040', '\061', + '\012', '\122', '\146', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\123', '\167', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\116', '\151', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\157', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\150', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\112', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\144', '\106', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\166', '\106', '\040', '\166', '\141', '\040', '\061', + '\012', '\143', '\160', '\126', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\164', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\127', '\155', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\120', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\102', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\162', '\154', '\126', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\132', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\124', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\150', '\146', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\123', '\166', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\153', '\155', '\107', '\040', '\153', '\141', '\040', '\061', + '\012', '\163', '\104', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\107', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\102', '\154', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\162', '\171', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\110', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\114', '\170', '\040', '\156', '\171', '\040', '\061', + '\012', '\154', '\161', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\142', '\102', '\040', '\142', '\151', '\040', '\061', + '\012', '\151', '\131', '\162', '\040', '\151', '\156', '\040', '\061', + '\012', '\167', '\104', '\172', '\040', '\164', '\172', '\040', '\061', + '\012', '\170', '\163', '\112', '\040', '\163', '\164', '\040', '\061', + '\012', '\142', '\172', '\131', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\115', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\125', '\165', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\170', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\166', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\153', '\162', '\132', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\167', '\126', '\040', '\167', '\141', '\040', '\061', + '\012', '\147', '\120', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\126', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\121', '\156', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\104', '\142', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\126', '\162', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\113', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\170', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\157', '\132', '\152', '\040', '\157', '\156', '\040', '\061', + '\012', '\172', '\101', '\171', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\115', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\166', '\111', '\040', '\166', '\141', '\040', '\061', + '\012', '\106', '\167', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\172', '\161', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\145', '\126', '\166', '\040', '\145', '\162', '\040', '\061', + '\012', '\171', '\127', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\167', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\114', '\155', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\166', '\130', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\130', '\150', '\163', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\154', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\161', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\142', '\113', '\040', '\163', '\172', '\040', '\061', + '\012', '\120', '\170', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\156', '\120', '\155', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\121', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\104', '\143', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\152', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\152', '\112', '\040', '\145', '\162', '\040', '\061', + '\012', '\142', '\115', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\151', '\131', '\142', '\040', '\151', '\156', '\040', '\061', + '\012', '\106', '\161', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\125', '\157', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\166', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\114', '\167', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\112', '\160', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\125', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\112', '\170', '\040', '\154', '\145', '\040', '\061', + '\012', '\130', '\167', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\113', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\132', '\156', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\103', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\142', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\121', '\165', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\116', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\166', '\126', '\040', '\166', '\141', '\040', '\061', + '\012', '\121', '\161', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\110', '\144', '\146', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\123', '\170', '\040', '\156', '\171', '\040', '\061', + '\012', '\161', '\123', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\150', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\115', '\166', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\143', '\104', '\160', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\110', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\155', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\164', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\142', '\112', '\040', '\144', '\145', '\040', '\061', + '\012', '\106', '\146', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\166', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\161', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\130', '\144', '\040', '\156', '\147', '\040', '\061', + '\012', '\165', '\106', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\160', '\122', '\040', '\151', '\152', '\040', '\061', + '\012', '\130', '\143', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\124', '\142', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\121', '\167', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\120', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\115', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\151', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\143', '\102', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\106', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\131', '\155', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\114', '\144', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\170', '\126', '\040', '\154', '\145', '\040', '\061', + '\012', '\143', '\103', '\153', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\126', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\154', '\124', '\040', '\154', '\145', '\040', '\061', + '\012', '\153', '\150', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\126', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\152', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\103', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\167', '\126', '\040', '\167', '\141', '\040', '\061', + '\012', '\171', '\142', '\132', '\040', '\142', '\145', '\040', '\061', + '\012', '\166', '\107', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\102', '\166', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\132', '\161', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\167', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\114', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\153', '\130', '\040', '\153', '\141', '\040', '\061', + '\012', '\116', '\142', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\130', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\144', '\121', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\131', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\131', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\172', '\123', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\171', '\143', '\132', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\156', '\125', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\103', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\156', '\131', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\164', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\167', '\117', '\040', '\163', '\164', '\040', '\061', + '\012', '\150', '\130', '\165', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\102', '\167', '\040', '\155', '\142', '\040', '\061', + '\012', '\167', '\155', '\106', '\040', '\155', '\145', '\040', '\061', + '\012', '\170', '\112', '\170', '\040', '\170', '\145', '\040', '\061', + '\012', '\144', '\130', '\152', '\040', '\144', '\145', '\040', '\061', + '\012', '\145', '\161', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\102', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\130', '\142', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\143', '\121', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\153', '\123', '\040', '\153', '\141', '\040', '\061', + '\012', '\164', '\117', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\121', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\166', '\126', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\102', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\103', '\153', '\040', '\144', '\145', '\040', '\061', + '\012', '\143', '\113', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\126', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\132', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\102', '\166', '\155', '\040', '\166', '\141', '\040', '\061', + '\012', '\154', '\161', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\170', '\122', '\040', '\146', '\157', '\040', '\061', + '\012', '\166', '\155', '\106', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\156', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\102', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\120', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\116', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\106', '\153', '\160', '\040', '\153', '\141', '\040', '\061', + '\012', '\131', '\171', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\125', '\142', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\172', '\120', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\155', '\121', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\143', '\101', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\113', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\166', '\132', '\040', '\166', '\141', '\040', '\061', + '\012', '\143', '\142', '\116', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\131', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\120', '\155', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\167', '\106', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\150', '\122', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\160', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\161', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\150', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\166', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\153', '\103', '\040', '\153', '\141', '\040', '\061', + '\012', '\171', '\164', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\114', '\156', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\170', '\104', '\040', '\144', '\145', '\040', '\061', + '\012', '\142', '\115', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\170', '\166', '\125', '\040', '\166', '\141', '\040', '\061', + '\012', '\121', '\172', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\163', '\162', '\115', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\114', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\107', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\126', '\155', '\171', '\040', '\155', '\145', '\040', '\061', + '\012', '\150', '\143', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\113', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\112', '\170', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\142', '\154', '\127', '\040', '\154', '\145', '\040', '\061', + '\012', '\160', '\121', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\142', '\105', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\127', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\131', '\155', '\040', '\163', '\164', '\040', '\061', + '\012', '\156', '\113', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\164', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\124', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\145', '\160', '\130', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\103', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\142', '\106', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\122', '\172', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\161', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\150', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\166', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\155', '\126', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\111', '\167', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\160', '\150', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\116', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\146', '\122', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\166', '\131', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\143', '\101', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\107', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\103', '\161', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\102', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\115', '\155', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\126', '\170', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\130', '\150', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\145', '\161', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\103', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\166', '\125', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\170', '\121', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\115', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\161', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\142', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\103', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\157', '\124', '\146', '\040', '\157', '\156', '\040', '\061', + '\012', '\153', '\142', '\127', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\152', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\161', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\131', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\150', '\105', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\131', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\143', '\111', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\166', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\157', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\106', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\161', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\116', '\170', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\126', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\172', '\110', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\142', '\123', '\040', '\142', '\145', '\040', '\061', + '\012', '\110', '\167', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\115', '\170', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\153', '\114', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\155', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\142', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\146', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\122', '\153', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\166', '\147', '\126', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\102', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\130', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\142', '\162', '\121', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\166', '\117', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\104', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\121', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\146', '\106', '\040', '\167', '\141', '\040', '\061', + '\012', '\150', '\132', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\147', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\156', '\131', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\130', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\145', '\116', '\142', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\170', '\123', '\040', '\146', '\157', '\040', '\061', + '\012', '\163', '\116', '\153', '\040', '\163', '\164', '\040', '\061', + '\012', '\155', '\106', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\125', '\165', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\144', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\157', '\172', '\127', '\040', '\157', '\156', '\040', '\061', + '\012', '\130', '\172', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\112', '\146', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\106', '\164', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\172', '\122', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\132', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\157', '\110', '\172', '\040', '\157', '\156', '\040', '\061', + '\012', '\161', '\166', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\157', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\123', '\144', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\170', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\105', '\147', '\146', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\115', '\146', '\040', '\144', '\145', '\040', '\061', + '\012', '\122', '\150', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\122', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\165', '\152', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\122', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\152', '\101', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\104', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\155', '\132', '\040', '\163', '\164', '\040', '\061', + '\012', '\152', '\111', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\153', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\113', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\163', '\103', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\165', '\124', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\126', '\163', '\040', '\154', '\145', '\040', '\061', + '\012', '\165', '\121', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\146', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\166', '\113', '\155', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\121', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\125', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\165', '\124', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\102', '\156', '\166', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\144', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\170', '\131', '\040', '\144', '\145', '\040', '\061', + '\012', '\150', '\147', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\144', '\146', '\040', '\144', '\145', '\040', '\061', + '\012', '\150', '\161', '\123', '\040', '\164', '\150', '\040', '\061', + '\012', '\145', '\112', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\107', '\165', '\040', '\165', '\156', '\040', '\061', + '\012', '\166', '\155', '\105', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\113', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\125', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\126', '\152', '\171', '\040', '\151', '\152', '\040', '\061', + '\012', '\165', '\166', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\110', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\115', '\150', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\163', '\132', '\040', '\163', '\164', '\040', '\061', + '\012', '\126', '\172', '\171', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\113', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\120', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\147', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\150', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\117', '\147', '\160', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\167', '\130', '\040', '\151', '\152', '\040', '\061', + '\012', '\154', '\131', '\171', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\172', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\130', '\152', '\040', '\152', '\157', '\040', '\061', + '\012', '\113', '\160', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\171', '\144', '\131', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\102', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\160', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\142', '\104', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\106', '\152', '\153', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\144', '\101', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\127', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\123', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\153', '\106', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\123', '\170', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\106', '\166', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\142', '\122', '\040', '\160', '\162', '\040', '\061', + '\012', '\161', '\162', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\132', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\166', '\125', '\155', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\105', '\171', '\040', '\167', '\141', '\040', '\061', + '\012', '\152', '\152', '\110', '\040', '\152', '\157', '\040', '\061', + '\012', '\163', '\104', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\125', '\152', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\156', '\111', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\117', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\103', '\152', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\142', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\161', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\145', '\120', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\122', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\160', '\166', '\107', '\040', '\166', '\141', '\040', '\061', + '\012', '\121', '\171', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\143', '\167', '\107', '\040', '\143', '\150', '\040', '\061', + '\012', '\104', '\164', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\120', '\142', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\122', '\147', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\152', '\125', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\112', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\122', '\170', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\164', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\166', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\113', '\155', '\040', '\153', '\141', '\040', '\061', + '\012', '\150', '\106', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\143', '\130', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\116', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\142', '\160', '\102', '\040', '\160', '\162', '\040', '\061', + '\012', '\170', '\161', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\131', '\171', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\107', '\160', '\040', '\156', '\147', '\040', '\061', + '\012', '\126', '\146', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\167', '\104', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\124', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\150', '\146', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\172', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\125', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\107', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\126', '\144', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\130', '\152', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\115', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\150', '\124', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\154', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\113', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\166', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\115', '\172', '\040', '\154', '\145', '\040', '\061', + '\012', '\115', '\167', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\127', '\154', '\166', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\172', '\107', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\155', '\104', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\117', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\142', '\142', '\111', '\040', '\142', '\145', '\040', '\061', + '\012', '\142', '\160', '\111', '\040', '\160', '\162', '\040', '\061', + '\012', '\146', '\121', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\121', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\105', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\106', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\127', '\150', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\166', '\121', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\131', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\170', '\115', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\120', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\152', '\104', '\040', '\151', '\152', '\040', '\061', + '\012', '\126', '\167', '\171', '\040', '\167', '\141', '\040', '\061', + '\012', '\131', '\161', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\143', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\131', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\112', '\142', '\040', '\156', '\147', '\040', '\061', + '\012', '\124', '\153', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\150', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\170', '\106', '\040', '\151', '\152', '\040', '\061', + '\012', '\106', '\160', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\153', '\130', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\147', '\132', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\156', '\111', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\171', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\102', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\123', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\161', '\111', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\131', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\162', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\163', '\110', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\162', '\113', '\040', '\145', '\162', '\040', '\061', + '\012', '\160', '\142', '\110', '\040', '\160', '\162', '\040', '\061', + '\012', '\172', '\126', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\121', '\142', '\040', '\144', '\145', '\040', '\061', + '\012', '\154', '\170', '\106', '\040', '\154', '\145', '\040', '\061', + '\012', '\163', '\147', '\127', '\040', '\156', '\147', '\040', '\061', + '\012', '\107', '\150', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\160', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\150', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\163', '\146', '\040', '\163', '\164', '\040', '\061', + '\012', '\121', '\147', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\122', '\144', '\160', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\166', '\113', '\040', '\166', '\141', '\040', '\061', + '\012', '\131', '\144', '\172', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\166', '\127', '\040', '\166', '\141', '\040', '\061', + '\012', '\143', '\120', '\155', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\121', '\171', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\167', '\106', '\040', '\167', '\141', '\040', '\061', + '\012', '\131', '\160', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\163', '\152', '\040', '\163', '\164', '\040', '\061', + '\012', '\131', '\147', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\126', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\171', '\170', '\114', '\040', '\156', '\171', '\040', '\061', + '\012', '\131', '\167', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\115', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\124', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\141', '\111', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\121', '\151', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\161', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\166', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\121', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\150', '\146', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\124', '\144', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\146', '\121', '\040', '\142', '\145', '\040', '\061', + '\012', '\113', '\146', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\143', '\130', '\163', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\131', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\121', '\157', '\143', '\040', '\162', '\157', '\040', '\061', + '\012', '\166', '\162', '\114', '\040', '\145', '\162', '\040', '\061', + '\012', '\160', '\132', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\143', '\144', '\130', '\040', '\143', '\150', '\040', '\061', + '\012', '\131', '\147', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\154', '\156', '\117', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\146', '\131', '\040', '\155', '\145', '\040', '\061', + '\012', '\146', '\156', '\126', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\142', '\132', '\040', '\155', '\145', '\040', '\061', + '\012', '\147', '\142', '\105', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\152', '\132', '\040', '\151', '\152', '\040', '\061', + '\012', '\106', '\160', '\171', '\040', '\160', '\162', '\040', '\061', + '\012', '\156', '\160', '\105', '\040', '\141', '\156', '\040', '\061', + '\012', '\122', '\170', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\157', '\127', '\160', '\040', '\157', '\156', '\040', '\061', + '\012', '\150', '\126', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\112', '\146', '\040', '\156', '\171', '\040', '\061', + '\012', '\163', '\121', '\144', '\040', '\163', '\164', '\040', '\061', + '\012', '\132', '\166', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\104', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\160', '\114', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\167', '\106', '\040', '\167', '\141', '\040', '\061', + '\012', '\170', '\102', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\113', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\130', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\111', '\165', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\147', '\102', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\112', '\160', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\147', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\116', '\150', '\040', '\150', '\157', '\040', '\061', + '\012', '\143', '\166', '\105', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\147', '\110', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\116', '\163', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\104', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\143', '\107', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\132', '\156', '\040', '\157', '\156', '\040', '\061', + '\012', '\165', '\125', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\154', '\121', '\040', '\154', '\145', '\040', '\061', + '\012', '\146', '\144', '\110', '\040', '\144', '\145', '\040', '\061', + '\012', '\145', '\132', '\152', '\040', '\145', '\162', '\040', '\061', + '\012', '\126', '\161', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\122', '\143', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\107', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\172', '\115', '\040', '\163', '\172', '\040', '\061', + '\012', '\121', '\160', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\123', '\160', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\143', '\107', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\161', '\101', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\142', '\113', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\145', '\127', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\153', '\103', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\172', '\102', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\165', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\117', '\171', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\115', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\161', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\161', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\167', '\114', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\120', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\123', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\120', '\153', '\040', '\144', '\145', '\040', '\061', + '\012', '\165', '\172', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\166', '\110', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\143', '\110', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\154', '\131', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\164', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\116', '\166', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\150', '\166', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\122', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\116', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\104', '\142', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\113', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\113', '\171', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\126', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\151', '\161', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\147', '\112', '\040', '\156', '\147', '\040', '\061', + '\012', '\145', '\112', '\163', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\117', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\162', '\130', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\161', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\127', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\142', '\124', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\103', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\141', '\117', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\157', '\103', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\156', '\105', '\040', '\141', '\156', '\040', '\061', + '\012', '\106', '\167', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\162', '\124', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\110', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\171', '\144', '\130', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\153', '\126', '\040', '\144', '\145', '\040', '\061', + '\012', '\122', '\161', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\171', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\130', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\157', '\112', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\170', '\111', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\132', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\154', '\132', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\167', '\130', '\040', '\163', '\172', '\040', '\061', + '\012', '\141', '\110', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\162', '\127', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\121', '\160', '\040', '\143', '\150', '\040', '\061', + '\012', '\112', '\167', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\145', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\121', '\152', '\040', '\163', '\164', '\040', '\061', + '\012', '\122', '\160', '\142', '\040', '\160', '\162', '\040', '\061', + '\012', '\155', '\132', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\102', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\155', '\170', '\126', '\040', '\155', '\145', '\040', '\061', + '\012', '\115', '\166', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\143', '\122', '\154', '\040', '\143', '\150', '\040', '\061', + '\012', '\106', '\172', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\102', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\127', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\166', '\161', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\111', '\170', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\171', '\150', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\171', '\121', '\040', '\167', '\141', '\040', '\061', + '\012', '\165', '\103', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\162', '\106', '\040', '\163', '\172', '\040', '\061', + '\012', '\151', '\171', '\121', '\040', '\151', '\156', '\040', '\061', + '\012', '\161', '\163', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\114', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\166', '\130', '\040', '\143', '\150', '\040', '\061', + '\012', '\123', '\143', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\162', '\114', '\040', '\145', '\162', '\040', '\061', + '\012', '\145', '\143', '\125', '\040', '\143', '\150', '\040', '\061', + '\012', '\126', '\170', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\103', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\166', '\130', '\040', '\157', '\156', '\040', '\061', + '\012', '\125', '\161', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\126', '\167', '\040', '\163', '\164', '\040', '\061', + '\012', '\163', '\160', '\130', '\040', '\163', '\164', '\040', '\061', + '\012', '\121', '\153', '\166', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\171', '\127', '\040', '\156', '\171', '\040', '\061', + '\012', '\162', '\102', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\144', '\103', '\040', '\144', '\145', '\040', '\061', + '\012', '\127', '\152', '\153', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\131', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\130', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\153', '\155', '\040', '\153', '\141', '\040', '\061', + '\012', '\150', '\150', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\104', '\166', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\143', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\132', '\171', '\040', '\167', '\141', '\040', '\061', + '\012', '\152', '\164', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\156', '\104', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\155', '\102', '\040', '\166', '\141', '\040', '\061', + '\012', '\153', '\152', '\102', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\144', '\107', '\040', '\143', '\150', '\040', '\061', + '\012', '\126', '\153', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\116', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\146', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\127', '\166', '\040', '\151', '\156', '\040', '\061', + '\012', '\127', '\164', '\156', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\146', '\105', '\040', '\154', '\145', '\040', '\061', + '\012', '\144', '\132', '\142', '\040', '\144', '\145', '\040', '\061', + '\012', '\145', '\161', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\125', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\167', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\125', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\107', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\167', '\130', '\040', '\141', '\156', '\040', '\061', + '\012', '\116', '\142', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\152', '\120', '\040', '\151', '\152', '\040', '\061', + '\012', '\163', '\161', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\121', '\146', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\132', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\127', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\115', '\170', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\106', '\151', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\152', '\130', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\104', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\104', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\125', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\150', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\110', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\124', '\152', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\165', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\132', '\160', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\126', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\106', '\160', '\040', '\156', '\147', '\040', '\061', + '\012', '\107', '\171', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\154', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\102', '\153', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\150', '\150', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\166', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\111', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\114', '\154', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\112', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\145', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\154', '\130', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\143', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\164', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\153', '\127', '\040', '\153', '\141', '\040', '\061', + '\012', '\147', '\112', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\121', '\171', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\120', '\172', '\040', '\163', '\164', '\040', '\061', + '\012', '\142', '\155', '\117', '\040', '\155', '\145', '\040', '\061', + '\012', '\131', '\164', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\161', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\151', '\102', '\153', '\040', '\151', '\156', '\040', '\061', + '\012', '\165', '\172', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\116', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\172', '\122', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\110', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\165', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\161', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\102', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\166', '\101', '\040', '\166', '\141', '\040', '\061', + '\012', '\145', '\126', '\152', '\040', '\145', '\162', '\040', '\061', + '\012', '\172', '\107', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\143', '\102', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\160', '\110', '\040', '\153', '\141', '\040', '\061', + '\012', '\155', '\104', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\166', '\165', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\126', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\155', '\172', '\123', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\166', '\115', '\040', '\151', '\152', '\040', '\061', + '\012', '\163', '\146', '\126', '\040', '\163', '\164', '\040', '\061', + '\012', '\150', '\121', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\124', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\120', '\154', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\170', '\112', '\040', '\146', '\157', '\040', '\061', + '\012', '\161', '\121', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\106', '\156', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\112', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\116', '\163', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\114', '\152', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\163', '\122', '\142', '\040', '\163', '\164', '\040', '\061', + '\012', '\160', '\143', '\131', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\126', '\155', '\040', '\166', '\141', '\040', '\061', + '\012', '\163', '\121', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\131', '\167', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\161', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\152', '\113', '\040', '\163', '\164', '\040', '\061', + '\012', '\132', '\153', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\115', '\152', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\104', '\167', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\142', '\116', '\040', '\167', '\141', '\040', '\061', + '\012', '\155', '\166', '\113', '\040', '\166', '\141', '\040', '\061', + '\012', '\162', '\114', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\114', '\142', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\167', '\152', '\117', '\040', '\151', '\152', '\040', '\061', + '\012', '\154', '\121', '\172', '\040', '\154', '\145', '\040', '\061', + '\012', '\113', '\167', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\155', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\142', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\143', '\113', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\161', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\126', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\170', '\143', '\106', '\040', '\143', '\150', '\040', '\061', + '\012', '\105', '\167', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\107', '\160', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\142', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\110', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\130', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\117', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\113', '\142', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\110', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\152', '\120', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\121', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\106', '\146', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\131', '\142', '\040', '\157', '\156', '\040', '\061', + '\012', '\106', '\161', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\130', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\111', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\160', '\115', '\146', '\040', '\160', '\162', '\040', '\061', + '\012', '\156', '\161', '\120', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\142', '\132', '\040', '\142', '\145', '\040', '\061', + '\012', '\150', '\163', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\152', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\132', '\161', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\120', '\170', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\102', '\172', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\160', '\142', '\111', '\040', '\160', '\162', '\040', '\061', + '\012', '\131', '\166', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\170', '\115', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\171', '\132', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\172', '\112', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\131', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\115', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\150', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\117', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\115', '\156', '\160', '\040', '\141', '\156', '\040', '\061', + '\012', '\111', '\146', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\131', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\170', '\166', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\146', '\107', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\161', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\114', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\153', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\157', '\131', '\153', '\040', '\157', '\156', '\040', '\061', + '\012', '\154', '\122', '\147', '\040', '\154', '\145', '\040', '\061', + '\012', '\154', '\117', '\170', '\040', '\154', '\145', '\040', '\061', + '\012', '\126', '\170', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\101', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\113', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\150', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\103', '\166', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\166', '\131', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\151', '\126', '\040', '\151', '\156', '\040', '\061', + '\012', '\143', '\162', '\106', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\105', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\122', '\162', '\154', '\040', '\145', '\162', '\040', '\061', + '\012', '\132', '\152', '\171', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\142', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\115', '\167', '\040', '\153', '\141', '\040', '\061', + '\012', '\166', '\132', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\106', '\170', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\172', '\153', '\123', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\113', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\142', '\111', '\040', '\163', '\172', '\040', '\061', + '\012', '\165', '\110', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\172', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\115', '\153', '\040', '\151', '\152', '\040', '\061', + '\012', '\106', '\153', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\113', '\155', '\040', '\144', '\145', '\040', '\061', + '\012', '\156', '\110', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\107', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\160', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\143', '\125', '\040', '\143', '\150', '\040', '\061', + '\012', '\141', '\127', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\144', '\123', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\150', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\141', '\110', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\155', '\111', '\040', '\166', '\141', '\040', '\061', + '\012', '\127', '\143', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\102', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\121', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\141', '\167', '\112', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\144', '\104', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\132', '\170', '\040', '\156', '\171', '\040', '\061', + '\012', '\113', '\153', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\102', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\172', '\101', '\040', '\154', '\145', '\040', '\061', + '\012', '\171', '\171', '\124', '\040', '\156', '\171', '\040', '\061', + '\012', '\161', '\145', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\160', '\105', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\106', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\171', '\107', '\040', '\156', '\171', '\040', '\061', + '\012', '\154', '\114', '\167', '\040', '\154', '\145', '\040', '\061', + '\012', '\142', '\166', '\123', '\040', '\166', '\141', '\040', '\061', + '\012', '\155', '\166', '\130', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\154', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\147', '\130', '\040', '\156', '\147', '\040', '\061', + '\012', '\154', '\121', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\155', '\131', '\040', '\155', '\145', '\040', '\061', + '\012', '\155', '\152', '\112', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\126', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\161', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\113', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\142', '\110', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\122', '\166', '\040', '\151', '\152', '\040', '\061', + '\012', '\114', '\160', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\172', '\120', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\153', '\122', '\040', '\153', '\141', '\040', '\061', + '\012', '\153', '\170', '\123', '\040', '\153', '\141', '\040', '\061', + '\012', '\152', '\127', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\116', '\153', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\113', '\143', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\112', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\170', '\167', '\132', '\040', '\167', '\141', '\040', '\061', + '\012', '\122', '\161', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\121', '\172', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\167', '\110', '\040', '\151', '\152', '\040', '\061', + '\012', '\104', '\161', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\114', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\130', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\146', '\104', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\152', '\130', '\040', '\163', '\164', '\040', '\061', + '\012', '\150', '\172', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\125', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\123', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\170', '\101', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\170', '\113', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\126', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\172', '\130', '\040', '\163', '\172', '\040', '\061', + '\012', '\125', '\143', '\163', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\141', '\110', '\040', '\141', '\156', '\040', '\061', + '\012', '\131', '\146', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\163', '\112', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\151', '\110', '\160', '\040', '\151', '\156', '\040', '\061', + '\012', '\151', '\171', '\103', '\040', '\151', '\156', '\040', '\061', + '\012', '\124', '\152', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\144', '\112', '\160', '\040', '\144', '\145', '\040', '\061', + '\012', '\112', '\147', '\166', '\040', '\156', '\147', '\040', '\061', + '\012', '\165', '\112', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\116', '\154', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\144', '\101', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\111', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\152', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\172', '\131', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\161', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\166', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\112', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\156', '\161', '\110', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\107', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\121', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\151', '\121', '\172', '\040', '\151', '\156', '\040', '\061', + '\012', '\164', '\114', '\156', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\126', '\152', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\161', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\162', '\116', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\113', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\141', '\126', '\040', '\141', '\156', '\040', '\061', + '\012', '\131', '\144', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\153', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\103', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\130', '\143', '\171', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\111', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\130', '\154', '\040', '\164', '\150', '\040', '\061', + '\012', '\141', '\106', '\163', '\040', '\141', '\156', '\040', '\061', + '\012', '\151', '\167', '\115', '\040', '\151', '\156', '\040', '\061', + '\012', '\107', '\167', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\130', '\154', '\160', '\040', '\154', '\145', '\040', '\061', + '\012', '\121', '\146', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\161', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\161', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\126', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\161', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\115', '\172', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\155', '\116', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\127', '\163', '\166', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\156', '\115', '\040', '\141', '\156', '\040', '\061', + '\012', '\165', '\123', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\103', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\152', '\110', '\040', '\163', '\172', '\040', '\061', + '\012', '\155', '\124', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\152', '\127', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\104', '\170', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\132', '\164', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\122', '\166', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\102', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\114', '\172', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\145', '\172', '\125', '\040', '\145', '\162', '\040', '\061', + '\012', '\152', '\161', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\152', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\104', '\143', '\147', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\102', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\150', '\117', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\160', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\161', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\103', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\162', '\122', '\166', '\040', '\145', '\162', '\040', '\061', + '\012', '\144', '\153', '\132', '\040', '\144', '\145', '\040', '\061', + '\012', '\107', '\147', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\121', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\107', '\143', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\123', '\143', '\147', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\104', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\142', '\104', '\040', '\160', '\162', '\040', '\061', + '\012', '\166', '\105', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\154', '\105', '\040', '\154', '\145', '\040', '\061', + '\012', '\122', '\152', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\154', '\106', '\167', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\161', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\141', '\120', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\152', '\104', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\143', '\105', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\123', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\104', '\147', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\165', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\120', '\166', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\112', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\121', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\167', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\160', '\101', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\107', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\130', '\172', '\040', '\143', '\150', '\040', '\061', + '\012', '\114', '\143', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\112', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\121', '\172', '\171', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\121', '\155', '\040', '\163', '\172', '\040', '\061', + '\012', '\110', '\150', '\156', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\144', '\131', '\040', '\144', '\145', '\040', '\061', + '\012', '\165', '\131', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\153', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\166', '\101', '\040', '\151', '\152', '\040', '\061', + '\012', '\112', '\166', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\151', '\167', '\132', '\040', '\151', '\156', '\040', '\061', + '\012', '\172', '\153', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\116', '\150', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\155', '\126', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\113', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\102', '\143', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\146', '\131', '\040', '\160', '\162', '\040', '\061', + '\012', '\161', '\125', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\161', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\167', '\117', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\130', '\155', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\110', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\102', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\165', '\120', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\112', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\111', '\160', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\161', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\161', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\113', '\142', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\146', '\114', '\040', '\166', '\141', '\040', '\061', + '\012', '\156', '\160', '\132', '\040', '\141', '\156', '\040', '\061', + '\012', '\157', '\161', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\161', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\172', '\125', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\116', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\130', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\103', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\156', '\172', '\112', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\113', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\155', '\102', '\040', '\155', '\145', '\040', '\061', + '\012', '\127', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\104', '\142', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\130', '\171', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\131', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\146', '\121', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\144', '\161', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\113', '\170', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\144', '\132', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\162', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\170', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\171', '\146', '\114', '\040', '\156', '\171', '\040', '\061', + '\012', '\171', '\131', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\163', '\142', '\110', '\040', '\163', '\164', '\040', '\061', + '\012', '\167', '\154', '\126', '\040', '\154', '\145', '\040', '\061', + '\012', '\165', '\113', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\150', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\170', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\114', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\156', '\121', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\161', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\116', '\161', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\146', '\104', '\040', '\151', '\152', '\040', '\061', + '\012', '\112', '\156', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\102', '\172', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\112', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\141', '\130', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\112', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\152', '\110', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\141', '\130', '\040', '\141', '\156', '\040', '\061', + '\012', '\127', '\150', '\163', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\131', '\162', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\155', '\123', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\150', '\171', '\040', '\164', '\150', '\040', '\061', + '\012', '\107', '\147', '\144', '\040', '\156', '\147', '\040', '\061', + '\012', '\130', '\155', '\171', '\040', '\155', '\145', '\040', '\061', + '\012', '\122', '\161', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\163', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\150', '\101', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\150', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\111', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\111', '\142', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\143', '\106', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\122', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\156', '\126', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\161', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\145', '\161', '\117', '\040', '\145', '\162', '\040', '\061', + '\012', '\107', '\153', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\116', '\156', '\172', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\161', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\112', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\166', '\101', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\115', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\167', '\123', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\101', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\103', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\155', '\105', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\150', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\167', '\105', '\040', '\145', '\162', '\040', '\061', + '\012', '\130', '\156', '\172', '\040', '\141', '\156', '\040', '\061', + '\012', '\125', '\150', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\156', '\122', '\040', '\141', '\156', '\040', '\061', + '\012', '\156', '\146', '\132', '\040', '\141', '\156', '\040', '\061', + '\012', '\121', '\160', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\161', '\170', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\107', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\122', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\122', '\167', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\164', '\143', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\102', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\122', '\152', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\146', '\131', '\040', '\144', '\145', '\040', '\061', + '\012', '\150', '\150', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\103', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\161', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\172', '\123', '\040', '\154', '\145', '\040', '\061', + '\012', '\114', '\162', '\155', '\040', '\145', '\162', '\040', '\061', + '\012', '\145', '\161', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\147', '\114', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\121', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\142', '\167', '\102', '\040', '\167', '\141', '\040', '\061', + '\012', '\154', '\107', '\146', '\040', '\154', '\145', '\040', '\061', + '\012', '\116', '\167', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\144', '\125', '\040', '\163', '\164', '\040', '\061', + '\012', '\132', '\170', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\171', '\104', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\114', '\163', '\167', '\040', '\163', '\164', '\040', '\061', + '\012', '\143', '\116', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\104', '\161', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\114', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\127', '\166', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\153', '\121', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\152', '\104', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\131', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\145', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\166', '\114', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\153', '\101', '\040', '\153', '\141', '\040', '\061', + '\012', '\116', '\166', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\144', '\152', '\115', '\040', '\144', '\145', '\040', '\061', + '\012', '\150', '\147', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\130', '\142', '\040', '\160', '\162', '\040', '\061', + '\012', '\124', '\154', '\167', '\040', '\154', '\145', '\040', '\061', + '\012', '\122', '\150', '\172', '\040', '\150', '\141', '\040', '\061', + '\012', '\167', '\153', '\120', '\040', '\153', '\141', '\040', '\061', + '\012', '\167', '\104', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\145', '\106', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\145', '\150', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\154', '\171', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\170', '\113', '\040', '\167', '\141', '\040', '\061', + '\012', '\144', '\120', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\106', '\144', '\040', '\163', '\164', '\040', '\061', + '\012', '\166', '\143', '\111', '\040', '\143', '\150', '\040', '\061', + '\012', '\106', '\170', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\166', '\122', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\161', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\115', '\152', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\142', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\160', '\120', '\040', '\153', '\141', '\040', '\061', + '\012', '\102', '\166', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\124', '\155', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\150', '\142', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\115', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\147', '\114', '\040', '\156', '\147', '\040', '\061', + '\012', '\145', '\146', '\125', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\121', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\143', '\101', '\040', '\143', '\150', '\040', '\061', + '\012', '\105', '\167', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\155', '\126', '\040', '\155', '\145', '\040', '\061', + '\012', '\121', '\143', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\172', '\107', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\113', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\106', '\167', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\122', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\120', '\153', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\115', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\172', '\117', '\040', '\163', '\172', '\040', '\061', + '\012', '\157', '\106', '\167', '\040', '\157', '\156', '\040', '\061', + '\012', '\150', '\112', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\126', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\151', '\126', '\172', '\040', '\151', '\156', '\040', '\061', + '\012', '\157', '\161', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\150', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\117', '\170', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\121', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\130', '\146', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\143', '\116', '\167', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\147', '\132', '\040', '\156', '\147', '\040', '\061', + '\012', '\124', '\166', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\163', '\111', '\170', '\040', '\163', '\164', '\040', '\061', + '\012', '\165', '\132', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\172', '\130', '\040', '\163', '\172', '\040', '\061', + '\012', '\131', '\154', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\110', '\146', '\040', '\157', '\156', '\040', '\061', + '\012', '\143', '\163', '\125', '\040', '\143', '\150', '\040', '\061', + '\012', '\121', '\172', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\102', '\146', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\112', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\147', '\121', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\170', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\124', '\156', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\113', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\142', '\161', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\152', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\160', '\106', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\166', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\153', '\146', '\102', '\040', '\153', '\141', '\040', '\061', + '\012', '\155', '\132', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\103', '\163', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\162', '\112', '\040', '\145', '\162', '\040', '\061', + '\012', '\107', '\146', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\152', '\142', '\120', '\040', '\151', '\152', '\040', '\061', + '\012', '\131', '\166', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\110', '\170', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\154', '\162', '\104', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\124', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\141', '\102', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\107', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\155', '\150', '\123', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\124', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\153', '\122', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\127', '\160', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\116', '\160', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\154', '\167', '\123', '\040', '\154', '\145', '\040', '\061', + '\012', '\155', '\107', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\156', '\161', '\124', '\040', '\141', '\156', '\040', '\061', + '\012', '\125', '\152', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\152', '\117', '\040', '\151', '\152', '\040', '\061', + '\012', '\144', '\115', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\113', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\132', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\116', '\152', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\131', '\154', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\155', '\126', '\146', '\040', '\155', '\145', '\040', '\061', + '\012', '\147', '\132', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\110', '\143', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\143', '\102', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\115', '\155', '\040', '\153', '\141', '\040', '\061', + '\012', '\154', '\167', '\103', '\040', '\154', '\145', '\040', '\061', + '\012', '\104', '\156', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\152', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\124', '\153', '\040', '\145', '\162', '\040', '\061', + '\012', '\126', '\172', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\126', '\170', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\167', '\154', '\121', '\040', '\154', '\145', '\040', '\061', + '\012', '\116', '\162', '\166', '\040', '\145', '\162', '\040', '\061', + '\012', '\160', '\152', '\120', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\167', '\132', '\040', '\167', '\141', '\040', '\061', + '\012', '\164', '\156', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\157', '\112', '\167', '\040', '\157', '\156', '\040', '\061', + '\012', '\153', '\112', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\126', '\160', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\101', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\150', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\103', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\162', '\125', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\122', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\154', '\103', '\040', '\143', '\150', '\040', '\061', + '\012', '\162', '\106', '\144', '\040', '\145', '\162', '\040', '\061', + '\012', '\164', '\167', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\103', '\167', '\040', '\153', '\141', '\040', '\061', + '\012', '\155', '\123', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\130', '\156', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\130', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\124', '\167', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\106', '\167', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\152', '\112', '\040', '\151', '\152', '\040', '\061', + '\012', '\154', '\142', '\121', '\040', '\154', '\145', '\040', '\061', + '\012', '\153', '\166', '\123', '\040', '\153', '\141', '\040', '\061', + '\012', '\123', '\155', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\102', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\116', '\172', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\121', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\166', '\114', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\126', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\125', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\132', '\144', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\111', '\171', '\040', '\145', '\147', '\040', '\061', + '\012', '\150', '\126', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\141', '\121', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\121', '\146', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\154', '\113', '\142', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\150', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\142', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\107', '\143', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\142', '\124', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\131', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\130', '\166', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\115', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\165', '\110', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\130', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\163', '\116', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\126', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\160', '\117', '\040', '\143', '\150', '\040', '\061', + '\012', '\106', '\147', '\142', '\040', '\156', '\147', '\040', '\061', + '\012', '\145', '\127', '\154', '\040', '\145', '\162', '\040', '\061', + '\012', '\153', '\113', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\103', '\142', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\155', '\146', '\110', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\111', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\146', '\130', '\040', '\163', '\164', '\040', '\061', + '\012', '\163', '\156', '\110', '\040', '\141', '\156', '\040', '\061', + '\012', '\110', '\152', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\114', '\155', '\146', '\040', '\155', '\145', '\040', '\061', + '\012', '\170', '\147', '\146', '\040', '\156', '\147', '\040', '\061', + '\012', '\105', '\166', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\117', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\110', '\152', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\165', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\132', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\154', '\116', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\125', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\156', '\114', '\163', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\153', '\123', '\040', '\151', '\152', '\040', '\061', + '\012', '\107', '\166', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\120', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\167', '\121', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\162', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\142', '\110', '\040', '\142', '\145', '\040', '\061', + '\012', '\147', '\150', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\115', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\131', '\166', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\114', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\102', '\144', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\112', '\144', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\122', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\166', '\147', '\120', '\040', '\156', '\147', '\040', '\061', + '\012', '\110', '\150', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\160', '\114', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\106', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\123', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\144', '\103', '\040', '\144', '\145', '\040', '\061', + '\012', '\153', '\107', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\126', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\166', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\167', '\117', '\040', '\153', '\141', '\040', '\061', + '\012', '\112', '\161', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\127', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\163', '\121', '\153', '\040', '\163', '\164', '\040', '\061', + '\012', '\150', '\156', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\162', '\104', '\040', '\145', '\162', '\040', '\061', + '\012', '\152', '\126', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\166', '\131', '\040', '\166', '\141', '\040', '\061', + '\012', '\142', '\146', '\111', '\040', '\142', '\145', '\040', '\061', + '\012', '\146', '\123', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\103', '\172', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\153', '\127', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\112', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\107', '\167', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\154', '\106', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\160', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\146', '\153', '\126', '\040', '\153', '\141', '\040', '\061', + '\012', '\143', '\131', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\162', '\127', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\102', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\112', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\111', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\144', '\101', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\121', '\171', '\040', '\167', '\141', '\040', '\061', + '\012', '\167', '\103', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\161', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\146', '\130', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\164', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\153', '\112', '\040', '\153', '\141', '\040', '\061', + '\012', '\121', '\172', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\113', '\163', '\040', '\156', '\147', '\040', '\061', + '\012', '\121', '\172', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\142', '\167', '\111', '\040', '\167', '\141', '\040', '\061', + '\012', '\124', '\163', '\142', '\040', '\163', '\164', '\040', '\061', + '\012', '\166', '\166', '\130', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\154', '\122', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\154', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\142', '\130', '\040', '\144', '\145', '\040', '\061', + '\012', '\110', '\146', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\102', '\163', '\152', '\040', '\163', '\164', '\040', '\061', + '\012', '\131', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\156', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\172', '\132', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\107', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\147', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\167', '\105', '\040', '\167', '\141', '\040', '\061', + '\012', '\117', '\171', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\121', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\122', '\171', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\155', '\130', '\040', '\155', '\145', '\040', '\061', + '\012', '\154', '\132', '\170', '\040', '\154', '\145', '\040', '\061', + '\012', '\147', '\106', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\112', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\113', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\111', '\153', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\153', '\107', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\107', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\122', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\104', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\166', '\114', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\107', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\151', '\111', '\152', '\040', '\151', '\156', '\040', '\061', + '\012', '\107', '\172', '\144', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\114', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\152', '\125', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\121', '\166', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\126', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\150', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\126', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\143', '\156', '\115', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\106', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\130', '\146', '\040', '\155', '\145', '\040', '\061', + '\012', '\162', '\103', '\142', '\040', '\145', '\162', '\040', '\061', + '\012', '\156', '\114', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\146', '\110', '\040', '\146', '\157', '\040', '\061', + '\012', '\151', '\161', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\150', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\110', '\170', '\040', '\163', '\164', '\040', '\061', + '\012', '\131', '\167', '\171', '\040', '\167', '\141', '\040', '\061', + '\012', '\155', '\104', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\143', '\102', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\102', '\155', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\122', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\123', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\103', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\124', '\143', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\141', '\132', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\112', '\143', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\156', '\142', '\106', '\040', '\141', '\156', '\040', '\061', + '\012', '\121', '\172', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\153', '\121', '\040', '\153', '\141', '\040', '\061', + '\012', '\150', '\172', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\110', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\150', '\161', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\105', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\171', '\152', '\106', '\040', '\151', '\152', '\040', '\061', + '\012', '\120', '\152', '\153', '\040', '\151', '\152', '\040', '\061', + '\012', '\163', '\146', '\125', '\040', '\163', '\164', '\040', '\061', + '\012', '\142', '\107', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\143', '\130', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\130', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\166', '\123', '\040', '\166', '\141', '\040', '\061', + '\012', '\160', '\115', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\112', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\126', '\167', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\103', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\144', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\122', '\152', '\040', '\145', '\162', '\040', '\061', + '\012', '\121', '\150', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\143', '\107', '\040', '\143', '\150', '\040', '\061', + '\012', '\157', '\105', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\121', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\154', '\123', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\114', '\161', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\154', '\110', '\040', '\141', '\156', '\040', '\061', + '\012', '\165', '\161', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\117', '\141', '\157', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\154', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\120', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\164', '\111', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\111', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\155', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\112', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\126', '\147', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\125', '\153', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\164', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\150', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\164', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\172', '\144', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\170', '\121', '\040', '\156', '\171', '\040', '\061', + '\012', '\156', '\162', '\120', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\110', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\131', '\143', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\107', '\161', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\106', '\147', '\171', '\040', '\156', '\147', '\040', '\061', + '\012', '\157', '\102', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\165', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\102', '\156', '\172', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\120', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\106', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\152', '\144', '\112', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\107', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\131', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\152', '\160', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\124', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\117', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\114', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\163', '\115', '\146', '\040', '\163', '\164', '\040', '\061', + '\012', '\157', '\126', '\154', '\040', '\157', '\156', '\040', '\061', + '\012', '\143', '\167', '\116', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\147', '\122', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\152', '\121', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\172', '\122', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\150', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\142', '\122', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\147', '\127', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\167', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\116', '\170', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\145', '\121', '\157', '\040', '\145', '\162', '\040', '\061', + '\012', '\155', '\121', '\160', '\040', '\155', '\145', '\040', '\061', + '\012', '\113', '\161', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\166', '\101', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\154', '\112', '\040', '\154', '\145', '\040', '\061', + '\012', '\171', '\126', '\170', '\040', '\156', '\171', '\040', '\061', + '\012', '\163', '\120', '\146', '\040', '\163', '\164', '\040', '\061', + '\012', '\144', '\121', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\163', '\132', '\142', '\040', '\163', '\164', '\040', '\061', + '\012', '\172', '\150', '\123', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\127', '\142', '\040', '\153', '\141', '\040', '\061', + '\012', '\155', '\161', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\106', '\146', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\161', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\161', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\124', '\154', '\171', '\040', '\154', '\145', '\040', '\061', + '\012', '\153', '\160', '\114', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\105', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\115', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\122', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\163', '\103', '\040', '\163', '\164', '\040', '\061', + '\012', '\152', '\154', '\123', '\040', '\154', '\145', '\040', '\061', + '\012', '\154', '\172', '\115', '\040', '\154', '\145', '\040', '\061', + '\012', '\120', '\146', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\165', '\112', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\126', '\146', '\040', '\156', '\171', '\040', '\061', + '\012', '\132', '\147', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\142', '\123', '\040', '\142', '\145', '\040', '\061', + '\012', '\157', '\106', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\166', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\143', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\167', '\125', '\040', '\167', '\141', '\040', '\061', + '\012', '\171', '\103', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\120', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\163', '\112', '\144', '\040', '\163', '\164', '\040', '\061', + '\012', '\142', '\155', '\116', '\040', '\155', '\145', '\040', '\061', + '\012', '\165', '\126', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\144', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\167', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\126', '\155', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\110', '\161', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\146', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\101', '\171', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\170', '\113', '\040', '\156', '\171', '\040', '\061', + '\012', '\110', '\167', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\111', '\160', '\040', '\156', '\147', '\040', '\061', + '\012', '\132', '\147', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\164', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\114', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\116', '\153', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\115', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\170', '\106', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\102', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\167', '\110', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\121', '\172', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\131', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\120', '\166', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\160', '\166', '\131', '\040', '\166', '\141', '\040', '\061', + '\012', '\112', '\170', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\147', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\161', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\154', '\114', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\115', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\123', '\142', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\105', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\146', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\143', '\123', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\103', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\110', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\172', '\153', '\106', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\165', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\124', '\142', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\111', '\160', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\131', '\172', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\121', '\167', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\106', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\120', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\104', '\160', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\112', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\160', '\116', '\040', '\160', '\162', '\040', '\061', + '\012', '\167', '\172', '\105', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\161', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\167', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\157', '\121', '\170', '\040', '\157', '\156', '\040', '\061', + '\012', '\154', '\103', '\160', '\040', '\154', '\145', '\040', '\061', + '\012', '\115', '\150', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\124', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\125', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\150', '\147', '\105', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\143', '\102', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\160', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\161', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\102', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\111', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\161', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\120', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\163', '\115', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\130', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\152', '\113', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\162', '\172', '\040', '\145', '\162', '\040', '\061', + '\012', '\110', '\167', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\146', '\127', '\040', '\156', '\171', '\040', '\061', + '\012', '\131', '\171', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\131', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\166', '\122', '\040', '\166', '\141', '\040', '\061', + '\012', '\163', '\122', '\172', '\040', '\163', '\164', '\040', '\061', + '\012', '\113', '\171', '\170', '\040', '\156', '\171', '\040', '\061', + '\012', '\156', '\170', '\122', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\144', '\112', '\040', '\143', '\150', '\040', '\061', + '\012', '\116', '\167', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\142', '\105', '\040', '\164', '\150', '\040', '\061', + '\012', '\157', '\145', '\132', '\040', '\145', '\162', '\040', '\061', + '\012', '\142', '\143', '\121', '\040', '\143', '\150', '\040', '\061', + '\012', '\123', '\167', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\111', '\153', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\102', '\166', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\150', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\161', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\113', '\142', '\040', '\153', '\141', '\040', '\061', + '\012', '\127', '\144', '\153', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\160', '\120', '\040', '\160', '\162', '\040', '\061', + '\012', '\153', '\121', '\171', '\040', '\153', '\141', '\040', '\061', + '\012', '\102', '\161', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\146', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\120', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\101', '\157', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\154', '\112', '\040', '\154', '\145', '\040', '\061', + '\012', '\131', '\156', '\166', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\115', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\121', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\141', '\146', '\115', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\166', '\117', '\040', '\151', '\152', '\040', '\061', + '\012', '\145', '\110', '\146', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\121', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\161', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\112', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\131', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\145', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\113', '\160', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\153', '\146', '\127', '\040', '\153', '\141', '\040', '\061', + '\012', '\127', '\144', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\142', '\116', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\102', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\163', '\165', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\105', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\146', '\132', '\040', '\145', '\162', '\040', '\061', + '\012', '\157', '\110', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\145', '\106', '\167', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\120', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\153', '\104', '\142', '\040', '\153', '\141', '\040', '\061', + '\012', '\164', '\132', '\156', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\143', '\113', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\127', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\125', '\170', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\171', '\121', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\132', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\152', '\166', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\147', '\117', '\040', '\156', '\147', '\040', '\061', + '\012', '\157', '\152', '\121', '\040', '\157', '\156', '\040', '\061', + '\012', '\113', '\167', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\106', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\115', '\144', '\040', '\163', '\164', '\040', '\061', + '\012', '\115', '\146', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\115', '\172', '\171', '\040', '\163', '\172', '\040', '\061', + '\012', '\116', '\167', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\171', '\167', '\124', '\040', '\167', '\141', '\040', '\061', + '\012', '\167', '\114', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\110', '\161', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\163', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\116', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\125', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\156', '\122', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\122', '\154', '\153', '\040', '\154', '\145', '\040', '\061', + '\012', '\102', '\161', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\146', '\111', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\126', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\107', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\154', '\130', '\040', '\154', '\145', '\040', '\061', + '\012', '\153', '\146', '\107', '\040', '\153', '\141', '\040', '\061', + '\012', '\167', '\126', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\143', '\144', '\105', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\172', '\105', '\040', '\164', '\150', '\040', '\061', + '\012', '\104', '\150', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\172', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\166', '\114', '\040', '\166', '\141', '\040', '\061', + '\012', '\142', '\172', '\121', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\126', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\132', '\170', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\114', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\124', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\161', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\155', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\154', '\104', '\040', '\154', '\145', '\040', '\061', + '\012', '\113', '\143', '\144', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\104', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\166', '\131', '\040', '\153', '\141', '\040', '\061', + '\012', '\143', '\121', '\154', '\040', '\143', '\150', '\040', '\061', + '\012', '\111', '\170', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\163', '\107', '\146', '\040', '\163', '\164', '\040', '\061', + '\012', '\147', '\106', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\122', '\153', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\110', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\103', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\102', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\112', '\167', '\040', '\163', '\164', '\040', '\061', + '\012', '\143', '\127', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\130', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\110', '\150', '\154', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\152', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\154', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\110', '\170', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\172', '\162', '\105', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\153', '\110', '\040', '\156', '\147', '\040', '\061', + '\012', '\165', '\110', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\172', '\155', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\102', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\146', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\114', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\125', '\161', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\153', '\104', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\161', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\114', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\131', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\113', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\111', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\156', '\162', '\125', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\106', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\163', '\142', '\103', '\040', '\163', '\164', '\040', '\061', + '\012', '\155', '\107', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\130', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\120', '\153', '\166', '\040', '\153', '\141', '\040', '\061', + '\012', '\103', '\161', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\103', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\162', '\116', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\167', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\112', '\147', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\154', '\121', '\040', '\154', '\145', '\040', '\061', + '\012', '\147', '\102', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\111', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\157', '\144', '\121', '\040', '\157', '\156', '\040', '\061', + '\012', '\121', '\156', '\172', '\040', '\141', '\156', '\040', '\061', + '\012', '\125', '\172', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\112', '\160', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\170', '\130', '\040', '\156', '\147', '\040', '\061', + '\012', '\132', '\153', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\130', '\153', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\150', '\122', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\143', '\126', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\115', '\155', '\040', '\163', '\172', '\040', '\061', + '\012', '\145', '\102', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\110', '\144', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\170', '\125', '\040', '\142', '\145', '\040', '\061', + '\012', '\170', '\144', '\113', '\040', '\144', '\145', '\040', '\061', + '\012', '\155', '\121', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\131', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\154', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\122', '\172', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\107', '\172', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\106', '\172', '\040', '\172', '\145', '\040', '\061', + '\012', '\161', '\117', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\147', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\157', '\107', '\155', '\040', '\157', '\156', '\040', '\061', + '\012', '\130', '\156', '\160', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\131', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\165', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\116', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\172', '\161', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\103', '\160', '\040', '\153', '\141', '\040', '\061', + '\012', '\127', '\150', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\121', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\167', '\101', '\040', '\166', '\141', '\040', '\061', + '\012', '\126', '\143', '\147', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\127', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\110', '\161', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\103', '\160', '\171', '\040', '\160', '\162', '\040', '\061', + '\012', '\172', '\143', '\114', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\146', '\106', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\130', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\141', '\130', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\123', '\167', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\150', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\170', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\107', '\161', '\165', '\040', '\165', '\156', '\040', '\061', + '\012', '\125', '\170', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\144', '\113', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\132', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\167', '\112', '\040', '\155', '\145', '\040', '\061', + '\012', '\143', '\166', '\104', '\040', '\143', '\150', '\040', '\061', + '\012', '\154', '\142', '\132', '\040', '\154', '\145', '\040', '\061', + '\012', '\120', '\172', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\144', '\117', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\112', '\156', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\127', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\130', '\171', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\165', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\130', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\170', '\156', '\114', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\115', '\146', '\040', '\156', '\147', '\040', '\061', + '\012', '\162', '\116', '\146', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\121', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\161', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\106', '\172', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\160', '\124', '\040', '\166', '\141', '\040', '\061', + '\012', '\116', '\167', '\171', '\040', '\167', '\141', '\040', '\061', + '\012', '\171', '\161', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\150', '\117', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\126', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\131', '\142', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\166', '\116', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\111', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\161', '\161', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\142', '\106', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\115', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\124', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\122', '\150', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\127', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\114', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\163', '\104', '\040', '\163', '\164', '\040', '\061', + '\012', '\165', '\115', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\110', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\147', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\114', '\155', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\166', '\153', '\125', '\040', '\153', '\141', '\040', '\061', + '\012', '\154', '\101', '\170', '\040', '\154', '\145', '\040', '\061', + '\012', '\113', '\172', '\144', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\113', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\121', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\147', '\106', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\171', '\130', '\040', '\167', '\141', '\040', '\061', + '\012', '\172', '\146', '\125', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\160', '\125', '\040', '\160', '\162', '\040', '\061', + '\012', '\171', '\167', '\112', '\040', '\167', '\141', '\040', '\061', + '\012', '\101', '\171', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\111', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\165', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\146', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\102', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\110', '\164', '\171', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\122', '\166', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\124', '\142', '\040', '\160', '\162', '\040', '\061', + '\012', '\125', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\124', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\112', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\125', '\151', '\167', '\040', '\151', '\156', '\040', '\061', + '\012', '\112', '\154', '\160', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\120', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\103', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\154', '\161', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\154', '\132', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\117', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\153', '\154', '\113', '\040', '\154', '\145', '\040', '\061', + '\012', '\153', '\146', '\121', '\040', '\153', '\141', '\040', '\061', + '\012', '\165', '\112', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\153', '\120', '\040', '\153', '\141', '\040', '\061', + '\012', '\107', '\161', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\154', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\171', '\104', '\040', '\156', '\171', '\040', '\061', + '\012', '\152', '\150', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\162', '\126', '\040', '\143', '\150', '\040', '\061', + '\012', '\104', '\167', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\171', '\152', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\160', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\155', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\127', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\120', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\125', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\142', '\122', '\040', '\141', '\156', '\040', '\061', + '\012', '\131', '\144', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\121', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\155', '\104', '\040', '\155', '\145', '\040', '\061', + '\012', '\112', '\153', '\152', '\040', '\153', '\141', '\040', '\061', + '\012', '\152', '\124', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\167', '\131', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\132', '\172', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\162', '\153', '\121', '\040', '\145', '\162', '\040', '\061', + '\012', '\142', '\104', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\161', '\123', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\130', '\162', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\132', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\116', '\147', '\160', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\161', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\166', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\127', '\142', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\167', '\166', '\113', '\040', '\166', '\141', '\040', '\061', + '\012', '\143', '\112', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\115', '\167', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\144', '\112', '\040', '\144', '\145', '\040', '\061', + '\012', '\151', '\167', '\105', '\040', '\151', '\156', '\040', '\061', + '\012', '\142', '\170', '\130', '\040', '\142', '\145', '\040', '\061', + '\012', '\152', '\170', '\124', '\040', '\151', '\152', '\040', '\061', + '\012', '\131', '\143', '\156', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\115', '\146', '\040', '\167', '\141', '\040', '\061', + '\012', '\142', '\161', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\161', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\122', '\152', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\131', '\171', '\040', '\167', '\141', '\040', '\061', + '\012', '\124', '\170', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\162', '\116', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\126', '\165', '\040', '\165', '\156', '\040', '\061', + '\012', '\155', '\122', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\106', '\152', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\171', '\121', '\040', '\156', '\171', '\040', '\061', + '\012', '\170', '\145', '\111', '\040', '\145', '\162', '\040', '\061', + '\012', '\127', '\161', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\154', '\171', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\104', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\131', '\172', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\102', '\170', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\167', '\114', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\161', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\147', '\113', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\161', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\163', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\106', '\161', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\130', '\172', '\040', '\145', '\162', '\040', '\061', + '\012', '\154', '\112', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\105', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\103', '\142', '\040', '\141', '\156', '\040', '\061', + '\012', '\130', '\162', '\144', '\040', '\145', '\162', '\040', '\061', + '\012', '\122', '\172', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\146', '\127', '\040', '\156', '\147', '\040', '\061', + '\012', '\130', '\164', '\154', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\124', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\165', '\146', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\152', '\121', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\154', '\127', '\040', '\154', '\145', '\040', '\061', + '\012', '\144', '\161', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\150', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\167', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\156', '\127', '\040', '\141', '\156', '\040', '\061', + '\012', '\122', '\146', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\113', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\153', '\106', '\167', '\040', '\153', '\141', '\040', '\061', + '\012', '\121', '\165', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\130', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\126', '\153', '\167', '\040', '\153', '\141', '\040', '\061', + '\012', '\164', '\106', '\150', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\111', '\165', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\124', '\146', '\040', '\154', '\145', '\040', '\061', + '\012', '\115', '\167', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\166', '\124', '\040', '\166', '\141', '\040', '\061', + '\012', '\153', '\113', '\160', '\040', '\153', '\141', '\040', '\061', + '\012', '\164', '\122', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\130', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\166', '\172', '\114', '\040', '\163', '\172', '\040', '\061', + '\012', '\112', '\143', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\124', '\142', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\144', '\121', '\040', '\144', '\145', '\040', '\061', + '\012', '\122', '\142', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\112', '\162', '\155', '\040', '\145', '\162', '\040', '\061', + '\012', '\163', '\122', '\152', '\040', '\163', '\164', '\040', '\061', + '\012', '\172', '\127', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\156', '\105', '\040', '\141', '\156', '\040', '\061', + '\012', '\113', '\143', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\121', '\161', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\160', '\111', '\040', '\160', '\162', '\040', '\061', + '\012', '\151', '\116', '\167', '\040', '\151', '\156', '\040', '\061', + '\012', '\165', '\152', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\110', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\166', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\110', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\166', '\112', '\040', '\166', '\141', '\040', '\061', + '\012', '\156', '\161', '\131', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\160', '\105', '\040', '\167', '\141', '\040', '\061', + '\012', '\110', '\167', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\170', '\172', '\111', '\040', '\163', '\172', '\040', '\061', + '\012', '\103', '\147', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\127', '\144', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\165', '\126', '\040', '\165', '\156', '\040', '\061', + '\012', '\142', '\152', '\116', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\121', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\142', '\170', '\105', '\040', '\142', '\145', '\040', '\061', + '\012', '\165', '\126', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\162', '\154', '\040', '\145', '\162', '\040', '\061', + '\012', '\114', '\162', '\170', '\040', '\145', '\162', '\040', '\061', + '\012', '\111', '\167', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\141', '\161', '\102', '\040', '\141', '\156', '\040', '\061', + '\012', '\126', '\143', '\160', '\040', '\143', '\150', '\040', '\061', + '\012', '\127', '\167', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\141', '\107', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\120', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\106', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\147', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\163', '\144', '\040', '\163', '\164', '\040', '\061', + '\012', '\126', '\170', '\163', '\040', '\163', '\172', '\040', '\061', + '\012', '\113', '\150', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\123', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\157', '\107', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\172', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\161', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\160', '\121', '\040', '\155', '\145', '\040', '\061', + '\012', '\113', '\143', '\160', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\167', '\104', '\040', '\163', '\164', '\040', '\061', + '\012', '\162', '\132', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\131', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\165', '\112', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\127', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\163', '\166', '\117', '\040', '\163', '\164', '\040', '\061', + '\012', '\160', '\106', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\131', '\152', '\170', '\040', '\151', '\152', '\040', '\061', + '\012', '\164', '\160', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\126', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\116', '\155', '\040', '\163', '\164', '\040', '\061', + '\012', '\154', '\113', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\166', '\125', '\040', '\141', '\156', '\040', '\061', + '\012', '\110', '\170', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\160', '\165', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\112', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\170', '\122', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\101', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\131', '\161', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\120', '\167', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\155', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\154', '\112', '\040', '\154', '\145', '\040', '\061', + '\012', '\155', '\161', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\103', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\132', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\141', '\106', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\157', '\131', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\120', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\144', '\112', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\167', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\103', '\143', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\106', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\162', '\131', '\040', '\145', '\162', '\040', '\061', + '\012', '\103', '\144', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\114', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\170', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\115', '\170', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\143', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\126', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\153', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\170', '\105', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\166', '\124', '\040', '\166', '\141', '\040', '\061', + '\012', '\115', '\154', '\167', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\164', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\107', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\152', '\105', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\152', '\115', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\167', '\120', '\040', '\151', '\152', '\040', '\061', + '\012', '\113', '\170', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\106', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\127', '\143', '\147', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\150', '\132', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\172', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\164', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\166', '\113', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\126', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\120', '\167', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\170', '\161', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\171', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\103', '\155', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\152', '\125', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\107', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\115', '\161', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\117', '\143', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\161', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\122', '\142', '\040', '\154', '\145', '\040', '\061', + '\012', '\164', '\146', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\132', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\132', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\160', '\132', '\040', '\156', '\147', '\040', '\061', + '\012', '\106', '\160', '\146', '\040', '\160', '\162', '\040', '\061', + '\012', '\161', '\164', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\150', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\161', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\147', '\107', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\157', '\124', '\040', '\157', '\156', '\040', '\061', + '\012', '\172', '\123', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\170', '\123', '\040', '\167', '\141', '\040', '\061', + '\012', '\127', '\162', '\146', '\040', '\145', '\162', '\040', '\061', + '\012', '\117', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\114', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\121', '\172', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\130', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\164', '\144', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\161', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\130', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\153', '\102', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\151', '\161', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\117', '\143', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\125', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\152', '\130', '\153', '\040', '\151', '\152', '\040', '\061', + '\012', '\150', '\142', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\143', '\147', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\167', '\123', '\040', '\167', '\141', '\040', '\061', + '\012', '\143', '\126', '\155', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\167', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\167', '\107', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\163', '\115', '\040', '\163', '\164', '\040', '\061', + '\012', '\120', '\161', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\120', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\167', '\107', '\040', '\167', '\141', '\040', '\061', + '\012', '\130', '\167', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\167', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\161', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\155', '\131', '\040', '\166', '\141', '\040', '\061', + '\012', '\165', '\166', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\146', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\142', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\116', '\146', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\160', '\110', '\040', '\160', '\162', '\040', '\061', + '\012', '\171', '\112', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\161', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\143', '\126', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\147', '\115', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\121', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\150', '\166', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\114', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\143', '\145', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\106', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\162', '\102', '\155', '\040', '\145', '\162', '\040', '\061', + '\012', '\155', '\144', '\126', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\106', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\156', '\130', '\040', '\141', '\156', '\040', '\061', + '\012', '\156', '\115', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\103', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\103', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\112', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\103', '\146', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\103', '\170', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\146', '\117', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\141', '\112', '\172', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\114', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\155', '\130', '\040', '\155', '\145', '\040', '\061', + '\012', '\131', '\146', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\144', '\112', '\146', '\040', '\144', '\145', '\040', '\061', + '\012', '\105', '\141', '\171', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\123', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\152', '\121', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\116', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\116', '\166', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\153', '\130', '\040', '\153', '\141', '\040', '\061', + '\012', '\112', '\167', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\152', '\166', '\114', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\160', '\110', '\040', '\160', '\162', '\040', '\061', + '\012', '\160', '\170', '\117', '\040', '\160', '\162', '\040', '\061', + '\012', '\166', '\120', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\144', '\127', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\142', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\157', '\105', '\040', '\157', '\156', '\040', '\061', + '\012', '\147', '\164', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\146', '\106', '\040', '\142', '\145', '\040', '\061', + '\012', '\155', '\166', '\127', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\163', '\115', '\040', '\163', '\164', '\040', '\061', + '\012', '\167', '\114', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\167', '\110', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\103', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\114', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\153', '\130', '\167', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\126', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\150', '\103', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\157', '\125', '\153', '\040', '\157', '\156', '\040', '\061', + '\012', '\172', '\143', '\106', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\115', '\166', '\040', '\163', '\164', '\040', '\061', + '\012', '\144', '\162', '\132', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\146', '\117', '\040', '\167', '\141', '\040', '\061', + '\012', '\171', '\106', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\130', '\141', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\115', '\165', '\040', '\165', '\156', '\040', '\061', + '\012', '\146', '\103', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\167', '\103', '\040', '\167', '\141', '\040', '\061', + '\012', '\157', '\124', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\106', '\153', '\155', '\040', '\153', '\141', '\040', '\061', + '\012', '\145', '\121', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\120', '\170', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\153', '\152', '\107', '\040', '\151', '\152', '\040', '\061', + '\012', '\164', '\107', '\163', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\161', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\155', '\130', '\040', '\155', '\145', '\040', '\061', + '\012', '\170', '\131', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\153', '\111', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\166', '\104', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\153', '\166', '\103', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\164', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\120', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\160', '\116', '\040', '\144', '\145', '\040', '\061', + '\012', '\150', '\116', '\162', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\156', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\110', '\153', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\111', '\161', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\146', '\116', '\040', '\167', '\141', '\040', '\061', + '\012', '\126', '\150', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\104', '\147', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\153', '\121', '\040', '\153', '\141', '\040', '\061', + '\012', '\127', '\170', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\111', '\143', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\131', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\161', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\166', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\163', '\170', '\125', '\040', '\163', '\164', '\040', '\061', + '\012', '\114', '\161', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\146', '\111', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\171', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\166', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\123', '\144', '\166', '\040', '\144', '\145', '\040', '\061', + '\012', '\165', '\131', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\121', '\147', '\155', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\130', '\141', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\102', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\160', '\131', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\152', '\127', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\113', '\146', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\152', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\120', '\152', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\141', '\152', '\130', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\130', '\144', '\040', '\163', '\164', '\040', '\061', + '\012', '\170', '\110', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\150', '\101', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\107', '\155', '\040', '\145', '\162', '\040', '\061', + '\012', '\121', '\164', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\162', '\131', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\120', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\122', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\117', '\147', '\040', '\167', '\141', '\040', '\061', + '\012', '\146', '\114', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\121', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\150', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\103', '\167', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\127', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\112', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\120', '\170', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\156', '\160', '\111', '\040', '\141', '\156', '\040', '\061', + '\012', '\154', '\156', '\127', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\161', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\167', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\103', '\144', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\146', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\160', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\115', '\142', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\156', '\167', '\116', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\114', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\127', '\143', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\126', '\166', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\126', '\153', '\170', '\040', '\153', '\141', '\040', '\061', + '\012', '\144', '\155', '\125', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\107', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\147', '\112', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\106', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\103', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\166', '\127', '\040', '\154', '\145', '\040', '\061', + '\012', '\123', '\166', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\112', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\165', '\132', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\124', '\152', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\111', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\126', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\144', '\117', '\040', '\144', '\145', '\040', '\061', + '\012', '\154', '\124', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\115', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\104', '\155', '\040', '\141', '\156', '\040', '\061', + '\012', '\124', '\172', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\160', '\103', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\121', '\153', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\160', '\131', '\040', '\160', '\162', '\040', '\061', + '\012', '\171', '\121', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\151', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\121', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\167', '\125', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\126', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\164', '\152', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\130', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\130', '\146', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\143', '\147', '\111', '\040', '\143', '\150', '\040', '\061', + '\012', '\120', '\153', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\152', '\106', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\162', '\112', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\167', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\164', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\110', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\110', '\147', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\104', '\172', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\142', '\105', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\146', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\122', '\152', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\155', '\131', '\040', '\155', '\145', '\040', '\061', + '\012', '\167', '\131', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\165', '\106', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\127', '\155', '\040', '\166', '\141', '\040', '\061', + '\012', '\171', '\126', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\147', '\114', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\155', '\122', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\146', '\102', '\040', '\163', '\172', '\040', '\061', + '\012', '\172', '\156', '\110', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\147', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\165', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\102', '\163', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\157', '\127', '\170', '\040', '\157', '\156', '\040', '\061', + '\012', '\120', '\152', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\112', '\144', '\146', '\040', '\144', '\145', '\040', '\061', + '\012', '\130', '\155', '\160', '\040', '\155', '\145', '\040', '\061', + '\012', '\163', '\147', '\117', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\103', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\164', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\104', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\142', '\121', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\161', '\165', '\115', '\040', '\165', '\156', '\040', '\061', + '\012', '\146', '\114', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\116', '\150', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\156', '\125', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\144', '\123', '\040', '\163', '\164', '\040', '\061', + '\012', '\167', '\127', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\106', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\106', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\127', '\167', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\114', '\161', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\161', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\155', '\104', '\040', '\163', '\172', '\040', '\061', + '\012', '\107', '\171', '\170', '\040', '\156', '\171', '\040', '\061', + '\012', '\142', '\153', '\122', '\040', '\153', '\141', '\040', '\061', + '\012', '\154', '\121', '\167', '\040', '\154', '\145', '\040', '\061', + '\012', '\120', '\161', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\106', '\167', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\164', '\110', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\171', '\114', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\170', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\162', '\103', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\172', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\112', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\146', '\123', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\115', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\154', '\126', '\040', '\154', '\145', '\040', '\061', + '\012', '\142', '\153', '\112', '\040', '\153', '\141', '\040', '\061', + '\012', '\153', '\156', '\110', '\040', '\141', '\156', '\040', '\061', + '\012', '\125', '\161', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\165', '\106', '\040', '\143', '\150', '\040', '\061', + '\012', '\151', '\131', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\125', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\163', '\102', '\142', '\040', '\163', '\164', '\040', '\061', + '\012', '\116', '\150', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\150', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\127', '\160', '\040', '\144', '\145', '\040', '\061', + '\012', '\131', '\166', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\122', '\170', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\153', '\172', '\107', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\165', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\166', '\104', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\167', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\152', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\132', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\112', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\156', '\117', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\143', '\101', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\146', '\113', '\040', '\155', '\145', '\040', '\061', + '\012', '\166', '\152', '\123', '\040', '\151', '\152', '\040', '\061', + '\012', '\116', '\166', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\144', '\146', '\102', '\040', '\144', '\145', '\040', '\061', + '\012', '\121', '\163', '\142', '\040', '\163', '\164', '\040', '\061', + '\012', '\144', '\130', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\172', '\122', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\105', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\141', '\107', '\172', '\040', '\141', '\156', '\040', '\061', + '\012', '\156', '\110', '\147', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\166', '\101', '\040', '\166', '\141', '\040', '\061', + '\012', '\102', '\146', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\126', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\163', '\131', '\040', '\163', '\164', '\040', '\061', + '\012', '\150', '\126', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\120', '\152', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\163', '\130', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\151', '\113', '\152', '\040', '\151', '\156', '\040', '\061', + '\012', '\161', '\141', '\105', '\040', '\141', '\156', '\040', '\061', + '\012', '\103', '\146', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\115', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\147', '\132', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\147', '\101', '\040', '\156', '\147', '\040', '\061', + '\012', '\151', '\167', '\112', '\040', '\151', '\156', '\040', '\061', + '\012', '\166', '\107', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\164', '\146', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\152', '\110', '\040', '\154', '\145', '\040', '\061', + '\012', '\172', '\107', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\155', '\113', '\040', '\155', '\145', '\040', '\061', + '\012', '\156', '\125', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\122', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\107', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\126', '\144', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\123', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\116', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\124', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\156', '\161', '\105', '\040', '\141', '\156', '\040', '\061', + '\012', '\127', '\156', '\147', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\126', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\126', '\163', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\116', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\116', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\156', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\112', '\163', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\166', '\112', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\154', '\115', '\040', '\154', '\145', '\040', '\061', + '\012', '\112', '\172', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\122', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\143', '\113', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\126', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\162', '\127', '\167', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\110', '\153', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\117', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\151', '\125', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\156', '\127', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\161', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\106', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\156', '\103', '\147', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\131', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\126', '\163', '\170', '\040', '\163', '\164', '\040', '\061', + '\012', '\155', '\164', '\115', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\150', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\164', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\143', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\116', '\167', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\144', '\130', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\112', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\163', '\117', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\122', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\122', '\156', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\155', '\120', '\040', '\153', '\141', '\040', '\061', + '\012', '\130', '\164', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\107', '\166', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\161', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\126', '\154', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\144', '\111', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\144', '\105', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\132', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\102', '\144', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\150', '\110', '\156', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\153', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\170', '\112', '\040', '\166', '\141', '\040', '\061', + '\012', '\154', '\162', '\101', '\040', '\145', '\162', '\040', '\061', + '\012', '\154', '\162', '\124', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\152', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\142', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\124', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\155', '\126', '\040', '\155', '\145', '\040', '\061', + '\012', '\162', '\104', '\153', '\040', '\145', '\162', '\040', '\061', + '\012', '\144', '\116', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\107', '\172', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\141', '\126', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\116', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\153', '\130', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\162', '\107', '\163', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\141', '\130', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\162', '\107', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\112', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\104', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\115', '\146', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\170', '\105', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\121', '\166', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\122', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\106', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\103', '\160', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\162', '\112', '\153', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\142', '\121', '\040', '\142', '\145', '\040', '\061', + '\012', '\130', '\172', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\106', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\146', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\164', '\167', '\105', '\040', '\164', '\150', '\040', '\061', + '\012', '\117', '\141', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\163', '\131', '\040', '\163', '\164', '\040', '\061', + '\012', '\167', '\144', '\132', '\040', '\144', '\145', '\040', '\061', + '\012', '\147', '\155', '\117', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\107', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\122', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\147', '\161', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\101', '\147', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\124', '\167', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\121', '\156', '\166', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\126', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\143', '\104', '\167', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\107', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\142', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\124', '\166', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\155', '\116', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\144', '\164', '\105', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\172', '\120', '\040', '\163', '\172', '\040', '\061', + '\012', '\126', '\163', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\107', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\120', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\171', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\170', '\106', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\104', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\110', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\170', '\132', '\040', '\146', '\157', '\040', '\061', + '\012', '\163', '\121', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\156', '\155', '\110', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\162', '\104', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\115', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\110', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\150', '\155', '\123', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\144', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\167', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\165', '\112', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\120', '\153', '\040', '\163', '\164', '\040', '\061', + '\012', '\130', '\152', '\160', '\040', '\151', '\152', '\040', '\061', + '\012', '\125', '\161', '\151', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\147', '\104', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\147', '\111', '\040', '\156', '\147', '\040', '\061', + '\012', '\165', '\106', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\116', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\150', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\114', '\170', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\123', '\146', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\122', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\167', '\113', '\040', '\167', '\141', '\040', '\061', + '\012', '\146', '\155', '\102', '\040', '\155', '\145', '\040', '\061', + '\012', '\166', '\162', '\126', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\123', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\120', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\110', '\142', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\142', '\112', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\161', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\123', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\115', '\153', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\126', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\153', '\113', '\040', '\153', '\141', '\040', '\061', + '\012', '\130', '\144', '\163', '\040', '\144', '\145', '\040', '\061', + '\012', '\171', '\142', '\102', '\040', '\142', '\145', '\040', '\061', + '\012', '\147', '\160', '\105', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\143', '\103', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\170', '\114', '\040', '\160', '\162', '\040', '\061', + '\012', '\147', '\120', '\155', '\040', '\156', '\147', '\040', '\061', + '\012', '\102', '\160', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\160', '\102', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\154', '\112', '\040', '\154', '\145', '\040', '\061', + '\012', '\160', '\153', '\103', '\040', '\153', '\141', '\040', '\061', + '\012', '\171', '\160', '\120', '\040', '\160', '\162', '\040', '\061', + '\012', '\116', '\161', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\147', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\105', '\161', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\122', '\153', '\040', '\144', '\145', '\040', '\061', + '\012', '\125', '\142', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\150', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\112', '\144', '\040', '\154', '\145', '\040', '\061', + '\012', '\160', '\166', '\116', '\040', '\166', '\141', '\040', '\061', + '\012', '\121', '\146', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\104', '\142', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\163', '\106', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\153', '\130', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\160', '\122', '\040', '\160', '\162', '\040', '\061', + '\012', '\160', '\152', '\112', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\153', '\121', '\040', '\156', '\147', '\040', '\061', + '\012', '\162', '\115', '\146', '\040', '\145', '\162', '\040', '\061', + '\012', '\112', '\163', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\117', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\104', '\161', '\165', '\040', '\165', '\156', '\040', '\061', + '\012', '\156', '\142', '\112', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\166', '\106', '\040', '\156', '\147', '\040', '\061', + '\012', '\106', '\156', '\160', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\160', '\126', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\164', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\105', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\150', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\117', '\150', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\130', '\171', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\144', '\125', '\040', '\144', '\145', '\040', '\061', + '\012', '\155', '\104', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\151', '\126', '\153', '\040', '\151', '\156', '\040', '\061', + '\012', '\110', '\161', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\160', '\132', '\040', '\160', '\157', '\040', '\061', + '\012', '\141', '\145', '\125', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\152', '\132', '\040', '\163', '\164', '\040', '\061', + '\012', '\163', '\107', '\160', '\040', '\163', '\164', '\040', '\061', + '\012', '\127', '\161', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\161', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\152', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\120', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\130', '\172', '\040', '\163', '\164', '\040', '\061', + '\012', '\170', '\166', '\120', '\040', '\166', '\141', '\040', '\061', + '\012', '\127', '\142', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\152', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\150', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\161', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\131', '\146', '\040', '\144', '\145', '\040', '\061', + '\012', '\160', '\106', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\163', '\106', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\110', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\150', '\101', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\154', '\105', '\040', '\154', '\145', '\040', '\061', + '\012', '\163', '\161', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\156', '\162', '\040', '\141', '\156', '\040', '\061', + '\012', '\106', '\170', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\110', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\144', '\102', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\110', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\120', '\170', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\110', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\156', '\161', '\112', '\040', '\141', '\156', '\040', '\061', + '\012', '\157', '\161', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\142', '\171', '\040', '\142', '\145', '\040', '\061', + '\012', '\164', '\142', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\123', '\146', '\040', '\153', '\141', '\040', '\061', + '\012', '\166', '\150', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\110', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\116', '\160', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\121', '\172', '\160', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\151', '\125', '\040', '\151', '\156', '\040', '\061', + '\012', '\162', '\152', '\132', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\152', '\125', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\164', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\131', '\147', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\141', '\121', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\127', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\141', '\126', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\121', '\170', '\040', '\160', '\162', '\040', '\061', + '\012', '\114', '\156', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\127', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\165', '\110', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\166', '\160', '\040', '\166', '\141', '\040', '\061', + '\012', '\112', '\170', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\172', '\110', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\166', '\125', '\040', '\166', '\141', '\040', '\061', + '\012', '\127', '\161', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\126', '\163', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\147', '\171', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\132', '\152', '\040', '\144', '\145', '\040', '\061', + '\012', '\165', '\103', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\170', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\110', '\154', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\127', '\161', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\104', '\170', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\144', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\166', '\115', '\040', '\166', '\141', '\040', '\061', + '\012', '\127', '\170', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\127', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\151', '\117', '\040', '\151', '\156', '\040', '\061', + '\012', '\146', '\104', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\142', '\110', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\151', '\126', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\120', '\155', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\130', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\146', '\114', '\040', '\146', '\157', '\040', '\061', + '\012', '\171', '\107', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\102', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\103', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\114', '\154', '\153', '\040', '\154', '\145', '\040', '\061', + '\012', '\171', '\115', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\162', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\144', '\130', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\170', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\155', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\122', '\172', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\156', '\102', '\144', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\127', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\165', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\171', '\106', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\126', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\147', '\120', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\106', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\106', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\122', '\155', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\153', '\154', '\110', '\040', '\154', '\145', '\040', '\061', + '\012', '\126', '\146', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\113', '\172', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\114', '\150', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\123', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\121', '\162', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\102', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\103', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\171', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\130', '\165', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\146', '\115', '\040', '\167', '\141', '\040', '\061', + '\012', '\153', '\144', '\113', '\040', '\144', '\145', '\040', '\061', + '\012', '\143', '\130', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\164', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\152', '\111', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\147', '\123', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\167', '\114', '\040', '\155', '\145', '\040', '\061', + '\012', '\153', '\172', '\125', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\132', '\162', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\161', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\112', '\151', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\104', '\144', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\113', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\141', '\125', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\170', '\105', '\040', '\163', '\164', '\040', '\061', + '\012', '\155', '\170', '\125', '\040', '\155', '\145', '\040', '\061', + '\012', '\143', '\167', '\131', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\160', '\103', '\040', '\160', '\162', '\040', '\061', + '\012', '\163', '\122', '\167', '\040', '\163', '\164', '\040', '\061', + '\012', '\113', '\153', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\170', '\101', '\040', '\167', '\141', '\040', '\061', + '\012', '\147', '\121', '\146', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\120', '\142', '\040', '\160', '\162', '\040', '\061', + '\012', '\110', '\167', '\165', '\040', '\153', '\165', '\040', '\061', + '\012', '\163', '\165', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\161', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\170', '\127', '\040', '\163', '\164', '\040', '\061', + '\012', '\141', '\106', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\127', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\142', '\132', '\040', '\160', '\162', '\040', '\061', + '\012', '\142', '\161', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\112', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\164', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\115', '\144', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\107', '\163', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\154', '\110', '\040', '\154', '\145', '\040', '\061', + '\012', '\144', '\155', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\162', '\153', '\040', '\145', '\162', '\040', '\061', + '\012', '\117', '\143', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\113', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\162', '\101', '\040', '\145', '\162', '\040', '\061', + '\012', '\147', '\170', '\105', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\127', '\165', '\040', '\165', '\156', '\040', '\061', + '\012', '\170', '\121', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\130', '\157', '\172', '\040', '\157', '\156', '\040', '\061', + '\012', '\146', '\155', '\120', '\040', '\155', '\145', '\040', '\061', + '\012', '\153', '\144', '\104', '\040', '\144', '\145', '\040', '\061', + '\012', '\142', '\102', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\160', '\101', '\040', '\160', '\162', '\040', '\061', + '\012', '\156', '\115', '\142', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\110', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\115', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\123', '\166', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\115', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\102', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\155', '\130', '\040', '\155', '\145', '\040', '\061', + '\012', '\150', '\143', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\162', '\125', '\040', '\145', '\162', '\040', '\061', + '\012', '\160', '\141', '\130', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\144', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\167', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\163', '\142', '\131', '\040', '\163', '\164', '\040', '\061', + '\012', '\155', '\150', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\146', '\132', '\040', '\160', '\162', '\040', '\061', + '\012', '\126', '\155', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\103', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\132', '\146', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\114', '\152', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\161', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\160', '\113', '\040', '\144', '\145', '\040', '\061', + '\012', '\164', '\146', '\107', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\152', '\122', '\040', '\151', '\156', '\040', '\061', + '\012', '\151', '\112', '\171', '\040', '\151', '\156', '\040', '\061', + '\012', '\161', '\146', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\162', '\123', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\147', '\124', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\117', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\156', '\105', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\127', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\160', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\167', '\144', '\117', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\131', '\171', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\162', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\155', '\106', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\150', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\110', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\112', '\172', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\105', '\171', '\040', '\156', '\171', '\040', '\061', + '\012', '\150', '\150', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\160', '\121', '\040', '\160', '\162', '\040', '\061', + '\012', '\161', '\131', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\164', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\113', '\144', '\170', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\146', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\142', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\142', '\142', '\117', '\040', '\142', '\145', '\040', '\061', + '\012', '\130', '\143', '\156', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\103', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\107', '\143', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\155', '\103', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\112', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\104', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\112', '\172', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\131', '\162', '\167', '\040', '\145', '\162', '\040', '\061', + '\012', '\113', '\163', '\170', '\040', '\163', '\164', '\040', '\061', + '\012', '\165', '\113', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\123', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\114', '\152', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\144', '\102', '\040', '\144', '\145', '\040', '\061', + '\012', '\172', '\127', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\167', '\131', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\115', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\142', '\110', '\040', '\144', '\145', '\040', '\061', + '\012', '\121', '\163', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\110', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\112', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\132', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\142', '\164', '\117', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\155', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\161', '\160', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\156', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\154', '\104', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\143', '\130', '\040', '\143', '\150', '\040', '\061', + '\012', '\131', '\166', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\132', '\146', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\161', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\161', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\110', '\164', '\150', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\164', '\114', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\117', '\152', '\040', '\151', '\156', '\040', '\061', + '\012', '\143', '\111', '\172', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\150', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\166', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\147', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\152', '\103', '\040', '\151', '\152', '\040', '\061', + '\012', '\117', '\152', '\160', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\166', '\111', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\161', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\161', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\151', '\110', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\170', '\112', '\040', '\151', '\152', '\040', '\061', + '\012', '\107', '\142', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\156', '\121', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\130', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\104', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\121', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\112', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\172', '\142', '\131', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\122', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\105', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\141', '\132', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\152', '\106', '\040', '\151', '\152', '\040', '\061', + '\012', '\154', '\161', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\123', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\142', '\130', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\112', '\166', '\040', '\151', '\152', '\040', '\061', + '\012', '\127', '\162', '\166', '\040', '\145', '\162', '\040', '\061', + '\012', '\113', '\160', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\170', '\141', '\131', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\103', '\166', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\142', '\122', '\040', '\142', '\145', '\040', '\061', + '\012', '\160', '\124', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\167', '\144', '\111', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\146', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\122', '\162', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\142', '\106', '\040', '\144', '\145', '\040', '\061', + '\012', '\142', '\172', '\106', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\167', '\117', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\162', '\131', '\040', '\145', '\162', '\040', '\061', + '\012', '\164', '\167', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\114', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\126', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\156', '\154', '\040', '\141', '\156', '\040', '\061', + '\012', '\127', '\147', '\142', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\165', '\123', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\111', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\124', '\167', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\113', '\144', '\040', '\141', '\156', '\040', '\061', + '\012', '\104', '\153', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\102', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\117', '\172', '\040', '\153', '\141', '\040', '\061', + '\012', '\172', '\117', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\156', '\172', '\105', '\040', '\141', '\156', '\040', '\061', + '\012', '\132', '\142', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\115', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\146', '\103', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\147', '\104', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\164', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\161', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\113', '\152', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\142', '\130', '\040', '\142', '\145', '\040', '\061', + '\012', '\172', '\146', '\110', '\040', '\163', '\172', '\040', '\061', + '\012', '\155', '\167', '\110', '\040', '\155', '\145', '\040', '\061', + '\012', '\172', '\121', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\107', '\172', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\163', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\116', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\114', '\161', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\155', '\127', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\116', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\143', '\121', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\115', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\107', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\165', '\103', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\102', '\160', '\166', '\040', '\160', '\162', '\040', '\061', + '\012', '\161', '\116', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\160', '\120', '\040', '\160', '\162', '\040', '\061', + '\012', '\154', '\130', '\146', '\040', '\154', '\145', '\040', '\061', + '\012', '\143', '\114', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\144', '\130', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\172', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\113', '\170', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\166', '\106', '\040', '\151', '\152', '\040', '\061', + '\012', '\162', '\106', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\105', '\164', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\131', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\113', '\163', '\166', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\112', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\146', '\153', '\103', '\040', '\153', '\141', '\040', '\061', + '\012', '\155', '\170', '\113', '\040', '\155', '\145', '\040', '\061', + '\012', '\146', '\142', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\162', '\127', '\040', '\145', '\162', '\040', '\061', + '\012', '\155', '\120', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\102', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\103', '\146', '\040', '\151', '\156', '\040', '\061', + '\012', '\163', '\162', '\110', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\152', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\143', '\107', '\040', '\143', '\150', '\040', '\061', + '\012', '\106', '\164', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\102', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\161', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\152', '\106', '\040', '\144', '\145', '\040', '\061', + '\012', '\164', '\147', '\125', '\040', '\164', '\150', '\040', '\061', + '\012', '\127', '\162', '\152', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\106', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\143', '\103', '\040', '\143', '\150', '\040', '\061', + '\012', '\145', '\161', '\101', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\142', '\107', '\040', '\160', '\162', '\040', '\061', + '\012', '\103', '\167', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\104', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\167', '\124', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\162', '\127', '\040', '\145', '\162', '\040', '\061', + '\012', '\153', '\121', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\167', '\115', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\171', '\103', '\156', '\040', '\156', '\144', '\040', '\061', + '\012', '\145', '\107', '\160', '\040', '\145', '\162', '\040', '\061', + '\012', '\165', '\120', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\161', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\151', '\111', '\040', '\151', '\156', '\040', '\061', + '\012', '\162', '\161', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\113', '\152', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\154', '\167', '\113', '\040', '\154', '\145', '\040', '\061', + '\012', '\146', '\152', '\121', '\040', '\151', '\152', '\040', '\061', + '\012', '\165', '\111', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\170', '\122', '\040', '\144', '\145', '\040', '\061', + '\012', '\107', '\161', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\114', '\142', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\122', '\144', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\171', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\164', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\122', '\153', '\040', '\143', '\150', '\040', '\061', + '\012', '\151', '\113', '\146', '\040', '\151', '\156', '\040', '\061', + '\012', '\150', '\142', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\161', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\155', '\106', '\040', '\155', '\145', '\040', '\061', + '\012', '\166', '\110', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\161', '\116', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\114', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\166', '\112', '\040', '\166', '\141', '\040', '\061', + '\012', '\142', '\147', '\112', '\040', '\156', '\147', '\040', '\061', + '\012', '\121', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\166', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\110', '\170', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\126', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\150', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\154', '\114', '\040', '\154', '\145', '\040', '\061', + '\012', '\153', '\144', '\110', '\040', '\144', '\145', '\040', '\061', + '\012', '\113', '\146', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\104', '\146', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\103', '\161', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\121', '\153', '\040', '\141', '\156', '\040', '\061', + '\012', '\127', '\156', '\172', '\040', '\141', '\156', '\040', '\061', + '\012', '\116', '\152', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\112', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\167', '\122', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\104', '\160', '\142', '\040', '\160', '\162', '\040', '\061', + '\012', '\163', '\120', '\152', '\040', '\163', '\164', '\040', '\061', + '\012', '\132', '\160', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\120', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\121', '\143', '\154', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\103', '\144', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\162', '\103', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\103', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\141', '\102', '\166', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\165', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\143', '\116', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\132', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\107', '\164', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\142', '\127', '\040', '\167', '\141', '\040', '\061', + '\012', '\166', '\120', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\164', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\127', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\142', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\127', '\155', '\142', '\040', '\155', '\145', '\040', '\061', + '\012', '\160', '\170', '\131', '\040', '\160', '\162', '\040', '\061', + '\012', '\150', '\121', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\116', '\156', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\144', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\131', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\154', '\130', '\040', '\154', '\145', '\040', '\061', + '\012', '\162', '\167', '\106', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\132', '\155', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\142', '\112', '\040', '\142', '\145', '\040', '\061', + '\012', '\161', '\141', '\102', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\126', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\125', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\146', '\103', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\170', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\124', '\142', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\157', '\106', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\124', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\150', '\102', '\153', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\121', '\145', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\102', '\145', '\040', '\144', '\145', '\040', '\061', + '\012', '\144', '\160', '\103', '\040', '\144', '\145', '\040', '\061', + '\012', '\153', '\160', '\127', '\040', '\153', '\141', '\040', '\061', + '\012', '\132', '\153', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\116', '\167', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\162', '\103', '\040', '\156', '\147', '\040', '\061', + '\012', '\165', '\130', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\125', '\157', '\171', '\040', '\157', '\156', '\040', '\061', + '\012', '\132', '\146', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\113', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\150', '\123', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\142', '\120', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\143', '\147', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\111', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\102', '\166', '\040', '\156', '\147', '\040', '\061', + '\012', '\147', '\132', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\120', '\165', '\040', '\165', '\156', '\040', '\061', + '\012', '\102', '\146', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\162', '\170', '\103', '\040', '\145', '\162', '\040', '\061', + '\012', '\163', '\114', '\153', '\040', '\163', '\164', '\040', '\061', + '\012', '\150', '\107', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\166', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\160', '\122', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\116', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\104', '\146', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\122', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\150', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\161', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\116', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\167', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\167', '\101', '\040', '\167', '\141', '\040', '\061', + '\012', '\167', '\115', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\123', '\156', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\146', '\104', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\107', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\130', '\161', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\113', '\167', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\121', '\150', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\117', '\171', '\170', '\040', '\156', '\171', '\040', '\061', + '\012', '\144', '\166', '\102', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\126', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\110', '\143', '\156', '\040', '\143', '\150', '\040', '\061', + '\012', '\163', '\142', '\125', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\106', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\153', '\146', '\124', '\040', '\153', '\141', '\040', '\061', + '\012', '\162', '\166', '\127', '\040', '\145', '\162', '\040', '\061', + '\012', '\131', '\170', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\156', '\106', '\153', '\040', '\141', '\156', '\040', '\061', + '\012', '\114', '\161', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\157', '\121', '\040', '\164', '\150', '\040', '\061', + '\012', '\116', '\146', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\162', '\110', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\112', '\153', '\040', '\143', '\150', '\040', '\061', + '\012', '\120', '\156', '\166', '\040', '\141', '\156', '\040', '\061', + '\012', '\116', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\146', '\105', '\040', '\156', '\171', '\040', '\061', + '\012', '\153', '\155', '\111', '\040', '\153', '\141', '\040', '\061', + '\012', '\107', '\155', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\170', '\123', '\040', '\142', '\145', '\040', '\061', + '\012', '\161', '\165', '\125', '\040', '\165', '\156', '\040', '\061', + '\012', '\161', '\131', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\113', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\150', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\157', '\146', '\131', '\040', '\157', '\156', '\040', '\061', + '\012', '\160', '\162', '\110', '\040', '\145', '\162', '\040', '\061', + '\012', '\152', '\130', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\121', '\155', '\040', '\166', '\141', '\040', '\061', + '\012', '\151', '\127', '\170', '\040', '\151', '\156', '\040', '\061', + '\012', '\142', '\172', '\103', '\040', '\163', '\172', '\040', '\061', + '\012', '\156', '\131', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\141', '\113', '\040', '\141', '\156', '\040', '\061', + '\012', '\107', '\147', '\142', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\123', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\162', '\121', '\172', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\153', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\126', '\156', '\154', '\040', '\141', '\156', '\040', '\061', + '\012', '\107', '\164', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\115', '\167', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\166', '\130', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\171', '\125', '\040', '\151', '\152', '\040', '\061', + '\012', '\121', '\161', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\110', '\156', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\106', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\161', '\153', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\127', '\143', '\153', '\040', '\143', '\150', '\040', '\061', + '\012', '\146', '\115', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\172', '\147', '\105', '\040', '\156', '\147', '\040', '\061', + '\012', '\157', '\112', '\172', '\040', '\157', '\156', '\040', '\061', + '\012', '\170', '\166', '\110', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\121', '\171', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\131', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\170', '\104', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\104', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\102', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\112', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\120', '\152', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\127', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\162', '\110', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\151', '\171', '\115', '\040', '\151', '\156', '\040', '\061', + '\012', '\171', '\170', '\104', '\040', '\156', '\171', '\040', '\061', + '\012', '\153', '\120', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\130', '\166', '\040', '\143', '\150', '\040', '\061', + '\012', '\116', '\155', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\153', '\116', '\040', '\153', '\141', '\040', '\061', + '\012', '\154', '\106', '\152', '\040', '\154', '\145', '\040', '\061', + '\012', '\171', '\155', '\125', '\040', '\155', '\145', '\040', '\061', + '\012', '\160', '\132', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\132', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\161', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\101', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\102', '\143', '\171', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\161', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\161', '\105', '\040', '\143', '\150', '\040', '\061', + '\012', '\122', '\167', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\143', '\162', '\115', '\040', '\143', '\150', '\040', '\061', + '\012', '\101', '\170', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\132', '\152', '\160', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\170', '\106', '\040', '\156', '\171', '\040', '\061', + '\012', '\166', '\132', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\120', '\142', '\040', '\163', '\164', '\040', '\061', + '\012', '\166', '\103', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\121', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\131', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\102', '\160', '\040', '\164', '\150', '\040', '\061', + '\012', '\112', '\142', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\147', '\161', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\162', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\103', '\146', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\155', '\142', '\112', '\040', '\155', '\145', '\040', '\061', + '\012', '\146', '\122', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\111', '\167', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\165', '\106', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\131', '\172', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\104', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\110', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\155', '\111', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\143', '\105', '\040', '\143', '\150', '\040', '\061', + '\012', '\115', '\150', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\165', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\130', '\146', '\040', '\156', '\147', '\040', '\061', + '\012', '\154', '\120', '\171', '\040', '\154', '\145', '\040', '\061', + '\012', '\142', '\120', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\130', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\117', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\116', '\155', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\104', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\103', '\167', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\154', '\152', '\120', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\161', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\162', '\105', '\040', '\141', '\156', '\040', '\061', + '\012', '\113', '\155', '\167', '\040', '\155', '\145', '\040', '\061', + '\012', '\147', '\112', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\147', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\172', '\122', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\112', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\141', '\125', '\151', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\156', '\131', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\132', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\106', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\123', '\170', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\101', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\151', '\132', '\166', '\040', '\151', '\156', '\040', '\061', + '\012', '\152', '\130', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\160', '\122', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\126', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\144', '\116', '\152', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\102', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\115', '\152', '\171', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\152', '\132', '\040', '\151', '\152', '\040', '\061', + '\012', '\164', '\114', '\163', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\131', '\152', '\040', '\151', '\156', '\040', '\061', + '\012', '\167', '\142', '\117', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\130', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\112', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\113', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\152', '\117', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\165', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\154', '\121', '\040', '\154', '\145', '\040', '\061', + '\012', '\171', '\146', '\102', '\040', '\156', '\171', '\040', '\061', + '\012', '\121', '\163', '\153', '\040', '\163', '\164', '\040', '\061', + '\012', '\125', '\167', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\132', '\161', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\155', '\131', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\130', '\167', '\040', '\160', '\162', '\040', '\061', + '\012', '\171', '\126', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\111', '\167', '\040', '\156', '\147', '\040', '\061', + '\012', '\110', '\170', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\120', '\147', '\171', '\040', '\156', '\147', '\040', '\061', + '\012', '\154', '\121', '\166', '\040', '\154', '\145', '\040', '\061', + '\012', '\142', '\156', '\113', '\040', '\141', '\156', '\040', '\061', + '\012', '\170', '\164', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\143', '\145', '\040', '\143', '\150', '\040', '\061', + '\012', '\116', '\152', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\166', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\115', '\167', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\107', '\164', '\156', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\112', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\112', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\104', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\114', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\157', '\145', '\125', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\166', '\131', '\040', '\143', '\150', '\040', '\061', + '\012', '\107', '\142', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\124', '\161', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\141', '\124', '\160', '\040', '\141', '\156', '\040', '\061', + '\012', '\131', '\167', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\144', '\124', '\040', '\144', '\145', '\040', '\061', + '\012', '\127', '\153', '\155', '\040', '\153', '\141', '\040', '\061', + '\012', '\160', '\170', '\101', '\040', '\160', '\162', '\040', '\061', + '\012', '\166', '\104', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\163', '\146', '\104', '\040', '\163', '\164', '\040', '\061', + '\012', '\162', '\161', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\110', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\151', '\126', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\115', '\146', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\126', '\155', '\040', '\163', '\164', '\040', '\061', + '\012', '\156', '\172', '\122', '\040', '\141', '\156', '\040', '\061', + '\012', '\121', '\166', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\153', '\132', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\127', '\156', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\132', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\166', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\120', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\123', '\170', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\116', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\162', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\114', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\126', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\105', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\161', '\103', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\132', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\150', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\116', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\106', '\152', '\040', '\145', '\162', '\040', '\061', + '\012', '\170', '\120', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\161', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\120', '\152', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\131', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\106', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\166', '\114', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\154', '\161', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\112', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\154', '\126', '\172', '\040', '\154', '\145', '\040', '\061', + '\012', '\143', '\132', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\143', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\150', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\114', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\171', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\150', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\164', '\113', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\122', '\142', '\040', '\160', '\162', '\040', '\061', + '\012', '\142', '\103', '\170', '\040', '\142', '\145', '\040', '\061', + '\012', '\156', '\112', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\152', '\167', '\106', '\040', '\151', '\152', '\040', '\061', + '\012', '\120', '\144', '\152', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\170', '\105', '\040', '\151', '\152', '\040', '\061', + '\012', '\163', '\154', '\132', '\040', '\154', '\145', '\040', '\061', + '\012', '\114', '\170', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\156', '\114', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\172', '\126', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\107', '\161', '\040', '\154', '\145', '\040', '\061', + '\012', '\121', '\142', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\152', '\142', '\131', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\123', '\155', '\040', '\163', '\172', '\040', '\061', + '\012', '\121', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\160', '\122', '\040', '\160', '\162', '\040', '\061', + '\012', '\147', '\103', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\131', '\166', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\151', '\150', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\146', '\170', '\040', '\146', '\157', '\040', '\061', + '\012', '\156', '\152', '\111', '\040', '\156', '\144', '\040', '\061', + '\012', '\131', '\160', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\154', '\170', '\124', '\040', '\154', '\145', '\040', '\061', + '\012', '\146', '\126', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\112', '\172', '\155', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\170', '\101', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\104', '\154', '\040', '\156', '\147', '\040', '\061', + '\012', '\105', '\141', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\121', '\143', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\107', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\114', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\153', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\142', '\113', '\040', '\167', '\141', '\040', '\061', + '\012', '\156', '\116', '\170', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\161', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\122', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\170', '\162', '\125', '\040', '\145', '\162', '\040', '\061', + '\012', '\146', '\156', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\172', '\102', '\040', '\163', '\172', '\040', '\061', + '\012', '\122', '\143', '\156', '\040', '\143', '\150', '\040', '\061', + '\012', '\161', '\142', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\162', '\104', '\040', '\145', '\162', '\040', '\061', + '\012', '\126', '\170', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\166', '\106', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\112', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\131', '\170', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\151', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\115', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\142', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\147', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\155', '\123', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\124', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\132', '\152', '\155', '\040', '\151', '\152', '\040', '\061', + '\012', '\116', '\152', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\144', '\161', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\131', '\152', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\113', '\167', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\170', '\125', '\040', '\143', '\150', '\040', '\061', + '\012', '\103', '\153', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\146', '\112', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\164', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\162', '\120', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\105', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\170', '\117', '\040', '\145', '\162', '\040', '\061', + '\012', '\162', '\132', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\142', '\132', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\130', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\166', '\104', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\143', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\153', '\117', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\116', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\106', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\130', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\126', '\153', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\107', '\152', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\121', '\143', '\144', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\166', '\106', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\106', '\170', '\040', '\170', '\145', '\040', '\061', + '\012', '\144', '\123', '\152', '\040', '\144', '\145', '\040', '\061', + '\012', '\170', '\120', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\157', '\106', '\160', '\040', '\157', '\156', '\040', '\061', + '\012', '\161', '\101', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\161', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\107', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\172', '\103', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\111', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\114', '\150', '\154', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\167', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\160', '\147', '\105', '\040', '\156', '\147', '\040', '\061', + '\012', '\101', '\167', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\102', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\113', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\120', '\146', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\165', '\161', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\112', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\124', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\164', '\127', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\144', '\116', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\162', '\116', '\040', '\145', '\162', '\040', '\061', + '\012', '\153', '\154', '\123', '\040', '\154', '\145', '\040', '\061', + '\012', '\161', '\105', '\151', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\106', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\161', '\122', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\156', '\155', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\130', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\170', '\116', '\040', '\146', '\157', '\040', '\061', + '\012', '\142', '\166', '\114', '\040', '\166', '\141', '\040', '\061', + '\012', '\157', '\107', '\146', '\040', '\157', '\156', '\040', '\061', + '\012', '\150', '\132', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\146', '\110', '\040', '\156', '\171', '\040', '\061', + '\012', '\144', '\143', '\105', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\147', '\127', '\040', '\156', '\147', '\040', '\061', + '\012', '\167', '\162', '\102', '\040', '\145', '\162', '\040', '\061', + '\012', '\153', '\127', '\155', '\040', '\153', '\141', '\040', '\061', + '\012', '\123', '\150', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\167', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\166', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\121', '\147', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\112', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\116', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\110', '\160', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\154', '\106', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\161', '\172', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\147', '\107', '\040', '\156', '\147', '\040', '\061', + '\012', '\153', '\144', '\132', '\040', '\144', '\145', '\040', '\061', + '\012', '\145', '\152', '\130', '\040', '\145', '\162', '\040', '\061', + '\012', '\120', '\170', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\166', '\124', '\040', '\166', '\141', '\040', '\061', + '\012', '\113', '\161', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\155', '\142', '\040', '\155', '\145', '\040', '\061', + '\012', '\170', '\106', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\167', '\121', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\120', '\147', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\160', '\114', '\040', '\160', '\162', '\040', '\061', + '\012', '\142', '\167', '\105', '\040', '\167', '\141', '\040', '\061', + '\012', '\170', '\110', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\126', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\155', '\106', '\040', '\151', '\152', '\040', '\061', + '\012', '\111', '\170', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\171', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\126', '\166', '\040', '\145', '\162', '\040', '\061', + '\012', '\131', '\164', '\167', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\160', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\160', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\152', '\130', '\040', '\163', '\172', '\040', '\061', + '\012', '\113', '\150', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\146', '\126', '\040', '\161', '\165', '\040', '\061', + '\012', '\112', '\172', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\153', '\124', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\102', '\172', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\152', '\122', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\147', '\127', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\155', '\111', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\103', '\142', '\040', '\153', '\141', '\040', '\061', + '\012', '\160', '\131', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\166', '\153', '\132', '\040', '\153', '\141', '\040', '\061', + '\012', '\167', '\166', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\126', '\146', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\154', '\132', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\116', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\103', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\142', '\126', '\040', '\153', '\141', '\040', '\061', + '\012', '\104', '\161', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\162', '\104', '\040', '\145', '\162', '\040', '\061', + '\012', '\154', '\142', '\107', '\040', '\154', '\145', '\040', '\061', + '\012', '\170', '\150', '\106', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\170', '\132', '\040', '\153', '\141', '\040', '\061', + '\012', '\111', '\165', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\106', '\170', '\040', '\156', '\171', '\040', '\061', + '\012', '\161', '\126', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\143', '\107', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\127', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\141', '\102', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\171', '\112', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\143', '\172', '\114', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\111', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\125', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\160', '\132', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\164', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\170', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\144', '\131', '\166', '\040', '\144', '\145', '\040', '\061', + '\012', '\151', '\161', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\167', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\146', '\104', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\126', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\113', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\146', '\121', '\040', '\166', '\141', '\040', '\061', + '\012', '\150', '\166', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\144', '\131', '\040', '\144', '\145', '\040', '\061', + '\012', '\110', '\172', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\131', '\163', '\040', '\143', '\150', '\040', '\061', + '\012', '\106', '\164', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\160', '\125', '\040', '\144', '\145', '\040', '\061', + '\012', '\114', '\154', '\144', '\040', '\154', '\145', '\040', '\061', + '\012', '\107', '\161', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\144', '\122', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\130', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\163', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\116', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\121', '\152', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\126', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\112', '\155', '\170', '\040', '\155', '\145', '\040', '\061', + '\012', '\160', '\104', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\151', '\102', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\114', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\156', '\107', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\124', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\116', '\144', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\161', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\125', '\141', '\167', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\172', '\116', '\040', '\163', '\172', '\040', '\061', + '\012', '\147', '\116', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\152', '\115', '\040', '\151', '\152', '\040', '\061', + '\012', '\154', '\156', '\113', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\170', '\142', '\040', '\163', '\172', '\040', '\061', + '\012', '\153', '\143', '\123', '\040', '\143', '\150', '\040', '\061', + '\012', '\156', '\152', '\115', '\040', '\141', '\156', '\040', '\061', + '\012', '\107', '\144', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\154', '\156', '\132', '\040', '\141', '\156', '\040', '\061', + '\012', '\131', '\147', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\150', '\113', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\160', '\124', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\161', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\151', '\152', '\130', '\040', '\151', '\156', '\040', '\061', + '\012', '\152', '\107', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\142', '\170', '\111', '\040', '\142', '\145', '\040', '\061', + '\012', '\166', '\130', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\126', '\162', '\167', '\040', '\145', '\162', '\040', '\061', + '\012', '\103', '\167', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\156', '\102', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\166', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\170', '\102', '\040', '\163', '\164', '\040', '\061', + '\012', '\155', '\126', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\103', '\172', '\170', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\171', '\126', '\040', '\156', '\171', '\040', '\061', + '\012', '\143', '\130', '\167', '\040', '\143', '\150', '\040', '\061', + '\012', '\121', '\156', '\146', '\040', '\141', '\156', '\040', '\061', + '\012', '\131', '\161', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\161', '\110', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\142', '\131', '\040', '\144', '\145', '\040', '\061', + '\012', '\123', '\161', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\113', '\161', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\160', '\112', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\142', '\115', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\106', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\113', '\142', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\162', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\112', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\156', '\122', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\146', '\161', '\116', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\146', '\101', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\157', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\117', '\167', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\156', '\154', '\107', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\111', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\161', '\162', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\116', '\167', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\161', '\141', '\127', '\040', '\141', '\156', '\040', '\061', + '\012', '\150', '\143', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\153', '\102', '\040', '\153', '\141', '\040', '\061', + '\012', '\116', '\144', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\113', '\172', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\170', '\102', '\040', '\156', '\147', '\040', '\061', + '\012', '\102', '\152', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\124', '\146', '\040', '\166', '\141', '\040', '\061', + '\012', '\152', '\106', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\115', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\165', '\146', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\160', '\107', '\040', '\141', '\156', '\040', '\061', + '\012', '\165', '\132', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\124', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\107', '\154', '\167', '\040', '\154', '\145', '\040', '\061', + '\012', '\113', '\161', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\103', '\170', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\152', '\132', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\123', '\161', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\171', '\120', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\145', '\121', '\152', '\040', '\145', '\162', '\040', '\061', + '\012', '\141', '\111', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\104', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\111', '\160', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\116', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\117', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\153', '\115', '\040', '\153', '\141', '\040', '\061', + '\012', '\166', '\106', '\171', '\040', '\166', '\141', '\040', '\061', + '\012', '\143', '\146', '\126', '\040', '\143', '\150', '\040', '\061', + '\012', '\113', '\152', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\153', '\120', '\040', '\156', '\147', '\040', '\061', + '\012', '\162', '\112', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\120', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\157', '\172', '\121', '\040', '\157', '\156', '\040', '\061', + '\012', '\104', '\154', '\153', '\040', '\154', '\145', '\040', '\061', + '\012', '\166', '\130', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\164', '\131', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\127', '\171', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\121', '\166', '\040', '\156', '\147', '\040', '\061', + '\012', '\131', '\167', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\124', '\160', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\121', '\150', '\143', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\165', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\156', '\142', '\123', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\121', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\147', '\132', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\125', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\165', '\127', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\115', '\146', '\040', '\155', '\145', '\040', '\061', + '\012', '\132', '\143', '\144', '\040', '\143', '\150', '\040', '\061', + '\012', '\151', '\102', '\160', '\040', '\151', '\156', '\040', '\061', + '\012', '\146', '\167', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\172', '\131', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\167', '\103', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\103', '\161', '\171', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\152', '\106', '\040', '\143', '\150', '\040', '\061', + '\012', '\107', '\146', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\155', '\143', '\127', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\161', '\126', '\040', '\143', '\150', '\040', '\061', + '\012', '\165', '\112', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\151', '\125', '\152', '\040', '\151', '\156', '\040', '\061', + '\012', '\166', '\153', '\122', '\040', '\153', '\141', '\040', '\061', + '\012', '\167', '\147', '\111', '\040', '\156', '\147', '\040', '\061', + '\012', '\166', '\125', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\127', '\144', '\156', '\040', '\144', '\145', '\040', '\061', + '\012', '\163', '\152', '\106', '\040', '\163', '\164', '\040', '\061', + '\012', '\164', '\120', '\166', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\122', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\154', '\126', '\040', '\154', '\145', '\040', '\061', + '\012', '\163', '\142', '\115', '\040', '\163', '\164', '\040', '\061', + '\012', '\155', '\146', '\124', '\040', '\155', '\145', '\040', '\061', + '\012', '\144', '\142', '\126', '\040', '\144', '\145', '\040', '\061', + '\012', '\106', '\155', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\147', '\146', '\125', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\142', '\102', '\040', '\143', '\150', '\040', '\061', + '\012', '\131', '\170', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\113', '\170', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\104', '\167', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\167', '\147', '\130', '\040', '\156', '\147', '\040', '\061', + '\012', '\163', '\120', '\166', '\040', '\163', '\164', '\040', '\061', + '\012', '\166', '\110', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\156', '\142', '\110', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\106', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\161', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\106', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\105', '\142', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\106', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\105', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\143', '\111', '\040', '\143', '\150', '\040', '\061', + '\012', '\142', '\115', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\172', '\132', '\167', '\040', '\163', '\172', '\040', '\061', + '\012', '\150', '\152', '\117', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\113', '\170', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\147', '\103', '\040', '\156', '\147', '\040', '\061', + '\012', '\143', '\156', '\114', '\040', '\141', '\156', '\040', '\061', + '\012', '\106', '\144', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\107', '\146', '\040', '\142', '\145', '\040', '\061', + '\012', '\123', '\152', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\142', '\115', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\130', '\167', '\040', '\166', '\141', '\040', '\061', + '\012', '\107', '\146', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\103', '\167', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\152', '\163', '\121', '\040', '\163', '\164', '\040', '\061', + '\012', '\132', '\147', '\166', '\040', '\156', '\147', '\040', '\061', + '\012', '\154', '\120', '\146', '\040', '\154', '\145', '\040', '\061', + '\012', '\156', '\155', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\126', '\144', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\143', '\130', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\152', '\124', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\167', '\105', '\040', '\155', '\145', '\040', '\061', + '\012', '\161', '\114', '\155', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\110', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\164', '\156', '\040', '\164', '\150', '\040', '\061', + '\012', '\116', '\164', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\147', '\127', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\120', '\161', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\160', '\120', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\122', '\146', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\160', '\114', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\156', '\104', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\160', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\144', '\172', '\123', '\040', '\163', '\172', '\040', '\061', + '\012', '\164', '\132', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\171', '\147', '\115', '\040', '\156', '\147', '\040', '\061', + '\012', '\142', '\170', '\103', '\040', '\142', '\145', '\040', '\061', + '\012', '\144', '\146', '\125', '\040', '\144', '\145', '\040', '\061', + '\012', '\142', '\155', '\102', '\040', '\155', '\145', '\040', '\061', + '\012', '\154', '\102', '\172', '\040', '\154', '\145', '\040', '\061', + '\012', '\147', '\112', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\131', '\153', '\166', '\040', '\153', '\141', '\040', '\061', + '\012', '\132', '\144', '\153', '\040', '\144', '\145', '\040', '\061', + '\012', '\167', '\156', '\121', '\040', '\141', '\156', '\040', '\061', + '\012', '\164', '\132', '\152', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\172', '\155', '\040', '\163', '\172', '\040', '\061', + '\012', '\126', '\146', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\115', '\167', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\162', '\125', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\161', '\167', '\160', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\143', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\146', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\165', '\157', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\103', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\151', '\121', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\102', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\126', '\142', '\040', '\163', '\164', '\040', '\061', + '\012', '\160', '\152', '\125', '\040', '\151', '\152', '\040', '\061', + '\012', '\163', '\143', '\121', '\040', '\143', '\150', '\040', '\061', + '\012', '\160', '\161', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\166', '\132', '\040', '\163', '\164', '\040', '\061', + '\012', '\132', '\160', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\160', '\151', '\126', '\040', '\151', '\156', '\040', '\061', + '\012', '\153', '\142', '\120', '\040', '\153', '\141', '\040', '\061', + '\012', '\167', '\161', '\115', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\126', '\142', '\040', '\145', '\162', '\040', '\061', + '\012', '\161', '\132', '\162', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\170', '\117', '\040', '\164', '\150', '\040', '\061', + '\012', '\167', '\124', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\112', '\172', '\146', '\040', '\163', '\172', '\040', '\061', + '\012', '\121', '\152', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\165', '\131', '\166', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\167', '\113', '\040', '\160', '\162', '\040', '\061', + '\012', '\150', '\166', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\104', '\161', '\145', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\146', '\111', '\040', '\160', '\162', '\040', '\061', + '\012', '\155', '\150', '\126', '\040', '\164', '\150', '\040', '\061', + '\012', '\152', '\147', '\105', '\040', '\156', '\147', '\040', '\061', + '\012', '\162', '\143', '\121', '\040', '\143', '\150', '\040', '\061', + '\012', '\153', '\155', '\124', '\040', '\153', '\141', '\040', '\061', + '\012', '\127', '\172', '\152', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\116', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\120', '\142', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\172', '\166', '\102', '\040', '\163', '\172', '\040', '\061', + '\012', '\170', '\150', '\112', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\166', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\116', '\166', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\163', '\167', '\132', '\040', '\163', '\164', '\040', '\061', + '\012', '\152', '\147', '\106', '\040', '\156', '\147', '\040', '\061', + '\012', '\155', '\146', '\114', '\040', '\155', '\145', '\040', '\061', + '\012', '\172', '\153', '\114', '\040', '\163', '\172', '\040', '\061', + '\012', '\152', '\126', '\160', '\040', '\151', '\152', '\040', '\061', + '\012', '\104', '\153', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\170', '\165', '\131', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\110', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\123', '\146', '\040', '\143', '\150', '\040', '\061', + '\012', '\112', '\172', '\144', '\040', '\163', '\172', '\040', '\061', + '\012', '\154', '\161', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\115', '\144', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\147', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\146', '\170', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\164', '\122', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\106', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\105', '\157', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\157', '\131', '\040', '\157', '\156', '\040', '\061', + '\012', '\101', '\167', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\124', '\170', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\143', '\111', '\147', '\040', '\143', '\150', '\040', '\061', + '\012', '\170', '\125', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\122', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\112', '\170', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\151', '\120', '\146', '\040', '\151', '\156', '\040', '\061', + '\012', '\145', '\152', '\131', '\040', '\145', '\162', '\040', '\061', + '\012', '\130', '\164', '\163', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\146', '\124', '\040', '\160', '\162', '\040', '\061', + '\012', '\120', '\161', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\163', '\126', '\040', '\163', '\164', '\040', '\061', + '\012', '\171', '\160', '\103', '\040', '\160', '\162', '\040', '\061', + '\012', '\167', '\115', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\105', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\170', '\131', '\040', '\166', '\141', '\040', '\061', + '\012', '\146', '\125', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\104', '\146', '\146', '\040', '\146', '\157', '\040', '\061', + '\012', '\147', '\161', '\121', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\115', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\166', '\112', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\146', '\120', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\144', '\114', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\144', '\115', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\116', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\141', '\107', '\166', '\040', '\141', '\156', '\040', '\061', + '\012', '\166', '\166', '\104', '\040', '\166', '\141', '\040', '\061', + '\012', '\144', '\112', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\170', '\131', '\040', '\145', '\162', '\040', '\061', + '\012', '\162', '\127', '\152', '\040', '\145', '\162', '\040', '\061', + '\012', '\120', '\166', '\170', '\040', '\166', '\141', '\040', '\061', + '\012', '\162', '\150', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\122', '\144', '\040', '\163', '\172', '\040', '\061', + '\012', '\113', '\147', '\166', '\040', '\156', '\147', '\040', '\061', + '\012', '\130', '\166', '\171', '\040', '\166', '\141', '\040', '\061', + '\012', '\153', '\132', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\153', '\160', '\113', '\040', '\153', '\141', '\040', '\061', + '\012', '\120', '\146', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\167', '\125', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\167', '\127', '\170', '\040', '\167', '\141', '\040', '\061', + '\012', '\152', '\120', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\147', '\114', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\151', '\112', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\147', '\120', '\170', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\110', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\166', '\112', '\142', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\150', '\102', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\121', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\105', '\157', '\141', '\040', '\141', '\156', '\040', '\061', + '\012', '\160', '\152', '\117', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\106', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\163', '\130', '\157', '\040', '\157', '\156', '\040', '\061', + '\012', '\167', '\142', '\131', '\040', '\167', '\141', '\040', '\061', + '\012', '\143', '\152', '\117', '\040', '\143', '\150', '\040', '\061', + '\012', '\155', '\154', '\132', '\040', '\154', '\145', '\040', '\061', + '\012', '\142', '\116', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\153', '\152', '\120', '\040', '\151', '\152', '\040', '\061', + '\012', '\171', '\130', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\126', '\152', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\116', '\166', '\040', '\166', '\141', '\040', '\061', + '\012', '\147', '\152', '\127', '\040', '\156', '\147', '\040', '\061', + '\012', '\156', '\130', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\144', '\161', '\112', '\040', '\161', '\165', '\040', '\061', + '\012', '\110', '\156', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\171', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\153', '\166', '\102', '\040', '\153', '\141', '\040', '\061', + '\012', '\161', '\171', '\102', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\104', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\172', '\147', '\120', '\040', '\156', '\147', '\040', '\061', + '\012', '\132', '\172', '\153', '\040', '\163', '\172', '\040', '\061', + '\012', '\146', '\115', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\172', '\131', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\142', '\124', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\117', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\163', '\101', '\040', '\163', '\164', '\040', '\061', + '\012', '\147', '\114', '\152', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\170', '\110', '\040', '\163', '\172', '\040', '\061', + '\012', '\143', '\114', '\155', '\040', '\143', '\150', '\040', '\061', + '\012', '\104', '\156', '\153', '\040', '\141', '\156', '\040', '\061', + '\012', '\172', '\111', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\153', '\160', '\112', '\040', '\153', '\141', '\040', '\061', + '\012', '\170', '\162', '\113', '\040', '\145', '\162', '\040', '\061', + '\012', '\145', '\111', '\142', '\040', '\145', '\162', '\040', '\061', + '\012', '\112', '\142', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\102', '\161', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\130', '\147', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\152', '\153', '\040', '\151', '\152', '\040', '\061', + '\012', '\144', '\122', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\164', '\152', '\132', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\121', '\154', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\171', '\127', '\040', '\151', '\156', '\040', '\061', + '\012', '\112', '\167', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\132', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\112', '\160', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\102', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\172', '\162', '\107', '\040', '\145', '\162', '\040', '\061', + '\012', '\150', '\127', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\144', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\161', '\163', '\132', '\040', '\161', '\165', '\040', '\061', + '\012', '\143', '\121', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\143', '\143', '\116', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\167', '\115', '\040', '\167', '\141', '\040', '\061', + '\012', '\147', '\142', '\130', '\040', '\156', '\147', '\040', '\061', + '\012', '\164', '\146', '\124', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\167', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\121', '\142', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\171', '\145', '\131', '\040', '\145', '\162', '\040', '\061', + '\012', '\141', '\125', '\142', '\040', '\141', '\156', '\040', '\061', + '\012', '\161', '\110', '\167', '\040', '\161', '\165', '\040', '\061', + '\012', '\106', '\150', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\106', '\156', '\147', '\040', '\141', '\156', '\040', '\061', + '\012', '\154', '\166', '\111', '\040', '\154', '\145', '\040', '\061', + '\012', '\152', '\103', '\146', '\040', '\151', '\152', '\040', '\061', + '\012', '\150', '\161', '\110', '\040', '\164', '\150', '\040', '\061', + '\012', '\164', '\124', '\161', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\146', '\111', '\040', '\163', '\164', '\040', '\061', + '\012', '\166', '\163', '\115', '\040', '\163', '\164', '\040', '\061', + '\012', '\154', '\104', '\160', '\040', '\154', '\145', '\040', '\061', + '\012', '\167', '\112', '\142', '\040', '\167', '\141', '\040', '\061', + '\012', '\142', '\150', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\122', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\164', '\123', '\040', '\164', '\150', '\040', '\061', + '\012', '\132', '\167', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\112', '\142', '\150', '\040', '\164', '\150', '\040', '\061', + '\012', '\150', '\110', '\142', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\104', '\171', '\040', '\160', '\162', '\040', '\061', + '\012', '\163', '\152', '\104', '\040', '\163', '\164', '\040', '\061', + '\012', '\117', '\171', '\160', '\040', '\160', '\162', '\040', '\061', + '\012', '\161', '\167', '\104', '\040', '\161', '\165', '\040', '\061', + '\012', '\152', '\142', '\104', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\160', '\107', '\040', '\166', '\141', '\040', '\061', + '\012', '\127', '\152', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\160', '\102', '\040', '\166', '\141', '\040', '\061', + '\012', '\141', '\130', '\161', '\040', '\141', '\156', '\040', '\061', + '\012', '\155', '\127', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\110', '\151', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\171', '\116', '\040', '\156', '\171', '\040', '\061', + '\012', '\155', '\142', '\121', '\040', '\155', '\145', '\040', '\061', + '\012', '\171', '\167', '\103', '\040', '\167', '\141', '\040', '\061', + '\012', '\157', '\126', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\155', '\132', '\040', '\155', '\145', '\040', '\061', + '\012', '\163', '\154', '\117', '\040', '\154', '\145', '\040', '\061', + '\012', '\146', '\130', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\153', '\131', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\160', '\126', '\165', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\153', '\125', '\040', '\153', '\141', '\040', '\061', + '\012', '\102', '\162', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\103', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\143', '\170', '\040', '\143', '\150', '\040', '\061', + '\012', '\172', '\115', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\122', '\167', '\040', '\143', '\150', '\040', '\061', + '\012', '\147', '\172', '\121', '\040', '\156', '\147', '\040', '\061', + '\012', '\121', '\142', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\152', '\165', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\170', '\123', '\172', '\040', '\163', '\172', '\040', '\061', + '\012', '\126', '\147', '\172', '\040', '\156', '\147', '\040', '\061', + '\012', '\157', '\115', '\167', '\040', '\157', '\156', '\040', '\061', + '\012', '\146', '\160', '\105', '\040', '\160', '\162', '\040', '\061', + '\012', '\170', '\152', '\130', '\040', '\151', '\152', '\040', '\061', + '\012', '\161', '\103', '\147', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\167', '\115', '\040', '\163', '\172', '\040', '\061', + '\012', '\165', '\121', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\161', '\120', '\153', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\152', '\104', '\040', '\151', '\152', '\040', '\061', + '\012', '\121', '\172', '\155', '\040', '\163', '\172', '\040', '\061', + '\012', '\163', '\111', '\160', '\040', '\163', '\164', '\040', '\061', + '\012', '\165', '\157', '\107', '\040', '\161', '\165', '\040', '\061', + '\012', '\162', '\126', '\154', '\040', '\145', '\162', '\040', '\061', + '\012', '\143', '\142', '\113', '\040', '\143', '\150', '\040', '\061', + '\012', '\150', '\130', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\113', '\163', '\146', '\040', '\163', '\164', '\040', '\061', + '\012', '\153', '\142', '\106', '\040', '\153', '\141', '\040', '\061', + '\012', '\167', '\102', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\151', '\131', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\163', '\147', '\110', '\040', '\156', '\147', '\040', '\061', + '\012', '\107', '\172', '\166', '\040', '\163', '\172', '\040', '\061', + '\012', '\171', '\166', '\105', '\040', '\166', '\141', '\040', '\061', + '\012', '\170', '\113', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\127', '\146', '\040', '\163', '\164', '\040', '\061', + '\012', '\172', '\102', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\171', '\153', '\110', '\040', '\153', '\141', '\040', '\061', + '\012', '\166', '\152', '\110', '\040', '\151', '\152', '\040', '\061', + '\012', '\167', '\150', '\111', '\040', '\164', '\150', '\040', '\061', + '\012', '\166', '\120', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\132', '\150', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\151', '\112', '\170', '\040', '\151', '\156', '\040', '\061', + '\012', '\143', '\132', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\161', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\115', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\143', '\125', '\152', '\040', '\143', '\150', '\040', '\061', + '\012', '\166', '\115', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\143', '\112', '\040', '\143', '\150', '\040', '\061', + '\012', '\102', '\143', '\155', '\040', '\143', '\150', '\040', '\061', + '\012', '\152', '\130', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\170', '\157', '\111', '\040', '\157', '\156', '\040', '\061', + '\012', '\132', '\153', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\130', '\172', '\162', '\040', '\145', '\162', '\040', '\061', + '\012', '\171', '\172', '\115', '\040', '\163', '\172', '\040', '\061', + '\012', '\161', '\152', '\130', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\116', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\160', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\102', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\164', '\130', '\144', '\040', '\164', '\150', '\040', '\061', + '\012', '\130', '\153', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\110', '\163', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\142', '\161', '\125', '\040', '\161', '\165', '\040', '\061', + '\012', '\163', '\147', '\106', '\040', '\156', '\147', '\040', '\061', + '\012', '\144', '\120', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\112', '\170', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\125', '\147', '\160', '\040', '\156', '\147', '\040', '\061', + '\012', '\122', '\170', '\151', '\040', '\151', '\156', '\040', '\061', + '\012', '\113', '\167', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\172', '\153', '\104', '\040', '\163', '\172', '\040', '\061', + '\012', '\122', '\161', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\160', '\112', '\142', '\040', '\160', '\162', '\040', '\061', + '\012', '\146', '\143', '\126', '\040', '\143', '\150', '\040', '\061', + '\012', '\151', '\126', '\144', '\040', '\151', '\156', '\040', '\061', + '\012', '\142', '\102', '\160', '\040', '\142', '\145', '\040', '\061', + '\012', '\117', '\152', '\167', '\040', '\151', '\152', '\040', '\061', + '\012', '\166', '\132', '\154', '\040', '\154', '\145', '\040', '\061', + '\012', '\111', '\171', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\146', '\153', '\125', '\040', '\153', '\141', '\040', '\061', + '\012', '\113', '\143', '\161', '\040', '\143', '\150', '\040', '\061', + '\012', '\144', '\102', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\115', '\161', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\151', '\115', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\127', '\167', '\163', '\040', '\163', '\164', '\040', '\061', + '\012', '\164', '\161', '\130', '\040', '\164', '\150', '\040', '\061', + '\012', '\170', '\150', '\104', '\040', '\164', '\150', '\040', '\061', + '\012', '\162', '\116', '\154', '\040', '\145', '\162', '\040', '\061', + '\012', '\160', '\127', '\144', '\040', '\144', '\145', '\040', '\061', + '\012', '\152', '\162', '\126', '\040', '\145', '\162', '\040', '\061', + '\012', '\102', '\155', '\152', '\040', '\151', '\152', '\040', '\061', + '\012', '\110', '\155', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\166', '\154', '\110', '\040', '\154', '\145', '\040', '\061', + '\012', '\115', '\170', '\142', '\040', '\142', '\145', '\040', '\061', + '\012', '\171', '\171', '\123', '\040', '\156', '\171', '\040', '\061', + '\012', '\161', '\166', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\146', '\166', '\130', '\040', '\166', '\141', '\040', '\061', + '\012', '\126', '\146', '\145', '\040', '\145', '\162', '\040', '\061', + '\012', '\103', '\144', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\113', '\147', '\145', '\040', '\156', '\147', '\040', '\061', + '\012', '\121', '\145', '\152', '\040', '\145', '\162', '\040', '\061', + '\012', '\162', '\166', '\132', '\040', '\145', '\162', '\040', '\061', + '\012', '\166', '\172', '\111', '\040', '\163', '\172', '\040', '\061', + '\012', '\144', '\104', '\156', '\040', '\141', '\156', '\040', '\061', + '\012', '\156', '\167', '\123', '\040', '\141', '\156', '\040', '\061', + '\012', '\121', '\143', '\142', '\040', '\143', '\150', '\040', '\061', + '\012', '\167', '\153', '\126', '\040', '\153', '\141', '\040', '\061', + '\012', '\165', '\103', '\170', '\040', '\161', '\165', '\040', '\061', + '\012', '\111', '\147', '\153', '\040', '\156', '\147', '\040', '\061', + '\012', '\126', '\160', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\150', '\102', '\155', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\144', '\121', '\040', '\144', '\145', '\040', '\061', + '\012', '\146', '\147', '\121', '\040', '\156', '\147', '\040', '\061', + '\012', '\171', '\121', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\147', '\170', '\110', '\040', '\156', '\147', '\040', '\061', + '\012', '\160', '\161', '\113', '\040', '\161', '\165', '\040', '\061', + '\012', '\154', '\122', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\130', '\144', '\166', '\040', '\144', '\145', '\040', '\061', + '\012', '\150', '\104', '\172', '\040', '\164', '\150', '\040', '\061', + '\012', '\144', '\106', '\167', '\040', '\144', '\145', '\040', '\061', + '\012', '\161', '\121', '\165', '\040', '\165', '\156', '\040', '\061', + '\012', '\170', '\142', '\104', '\040', '\142', '\145', '\040', '\061', + '\012', '\161', '\155', '\105', '\040', '\161', '\165', '\040', '\061', + '\012', '\155', '\127', '\155', '\040', '\155', '\145', '\040', '\061', + '\012', '\152', '\102', '\142', '\040', '\151', '\152', '\040', '\061', + '\012', '\152', '\130', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\146', '\170', '\125', '\040', '\146', '\157', '\040', '\061', + '\012', '\130', '\167', '\143', '\040', '\143', '\150', '\040', '\061', + '\012', '\114', '\161', '\146', '\040', '\161', '\165', '\040', '\061', + '\012', '\150', '\143', '\120', '\040', '\164', '\150', '\040', '\061', + '\012', '\160', '\146', '\102', '\040', '\160', '\162', '\040', '\061', + '\012', '\166', '\123', '\147', '\040', '\156', '\147', '\040', '\061', + '\012', '\170', '\112', '\167', '\040', '\167', '\141', '\040', '\061', + '\012', '\155', '\122', '\146', '\040', '\155', '\145', '\040', '\061', + '\012', '\150', '\161', '\127', '\040', '\164', '\150', '\040', '\061', + '\012', '\156', '\126', '\142', '\040', '\141', '\156', '\040', '\061', + '\012', '\143', '\105', '\165', '\040', '\143', '\150', '\040', '\061', + '\012', '\156', '\146', '\116', '\040', '\141', '\156', '\040', '\061', + '\012', '\156', '\126', '\152', '\040', '\141', '\156', '\040', '\061', + '\012', '\122', '\167', '\153', '\040', '\153', '\141', '\040', '\061', + '\012', '\156', '\155', '\107', '\040', '\141', '\156', '\040', '\061', + '\012', '\157', '\104', '\164', '\040', '\164', '\150', '\040', '\061', + '\012', '\153', '\120', '\142', '\040', '\153', '\141', '\040', '\061', + '\012', '\147', '\161', '\127', '\040', '\161', '\165', '\040', '\061', + '\012', '\121', '\150', '\146', '\040', '\164', '\150', '\040', '\061', + '\012', '\161', '\132', '\154', '\040', '\161', '\165', '\040', '\061', + '\012', '\172', '\110', '\161', '\040', '\161', '\165', '\040', '\061', + '\012', '\151', '\130', '\154', '\040', '\151', '\156', '\040', '\061', + '\012', +}; + +extern const int ksizeofUniversalAmbigsFile = sizeof(kUniversalAmbigsFile); + +} // namespace tesseract diff --git a/src/ccutil/universalambigs.h b/src/ccutil/universalambigs.h index 8b575f3533..f3f2fa1aaf 100644 --- a/src/ccutil/universalambigs.h +++ b/src/ccutil/universalambigs.h @@ -1,31 +1,31 @@ -/////////////////////////////////////////////////////////////////////// -// File: universalambigs.h -// Description: Data for a universal ambigs file that is useful for -// any language. -// Author: Ray Smith -// Created: Mon Mar 18 11:26:00 PDT 2013 -// -// (C) Copyright 2013, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -#ifndef TESSERACT_CCUTIL_UNIVERSALAMBIGS_H_ -#define TESSERACT_CCUTIL_UNIVERSALAMBIGS_H_ - -namespace tesseract { - -extern const char kUniversalAmbigsFile[]; -extern const int ksizeofUniversalAmbigsFile; - -} // namespace tesseract - -#endif // TESSERACT_CCUTIL_UNIVERSALAMBIGS_H_ +/////////////////////////////////////////////////////////////////////// +// File: universalambigs.h +// Description: Data for a universal ambigs file that is useful for +// any language. +// Author: Ray Smith +// Created: Mon Mar 18 11:26:00 PDT 2013 +// +// (C) Copyright 2013, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +#ifndef TESSERACT_CCUTIL_UNIVERSALAMBIGS_H_ +#define TESSERACT_CCUTIL_UNIVERSALAMBIGS_H_ + +namespace tesseract { + +extern const char kUniversalAmbigsFile[]; +extern const int ksizeofUniversalAmbigsFile; + +} // namespace tesseract + +#endif // TESSERACT_CCUTIL_UNIVERSALAMBIGS_H_ diff --git a/src/classify/blobclass.h b/src/classify/blobclass.h index 3b9056535f..be09465bd4 100644 --- a/src/classify/blobclass.h +++ b/src/classify/blobclass.h @@ -1,50 +1,50 @@ -/****************************************************************************** - ** Filename: blobclass.h - ** Purpose: Interface to high level classification and training. - ** Author: Dan Johnson - ** History: 5/29/89, DSJ, Created. - ** - ** (c) Copyright Hewlett-Packard Company, 1988. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - ******************************************************************************/ -#ifndef BLOBCLASS_H -#define BLOBCLASS_H - -/**---------------------------------------------------------------------------- - Include Files and Type Defines -----------------------------------------------------------------------------**/ -#include "strngs.h" - -/*--------------------------------------------------------------------------- - Macros -----------------------------------------------------------------------------*/ -/* macros for controlling the display of recognized characters */ -#define EnableCharDisplay() (DisplayCharacters = TRUE) -#define DisableCharDisplay() (DisplayCharacters = FALSE) - -/* macros for controlling the display of the entire match list */ -#define EnableMatchDisplay() (DisplayMatchList = TRUE) -#define DisableMatchDisplay() (DisplayMatchList = FALSE) - -/**---------------------------------------------------------------------------- - Public Function Prototypes -----------------------------------------------------------------------------**/ -namespace tesseract { -// Finds the name of the training font and returns it in fontname, by cutting -// it out based on the expectation that the filename is of the form: -// /path/to/dir/[lang].[fontname].exp[num] -// The [lang], [fontname] and [num] fields should not have '.' characters. -// If the global parameter classify_font_name is set, its value is used instead. -void ExtractFontName(const STRING& filename, STRING* fontname); - -} // namespace tesseract. - -#endif +/****************************************************************************** + ** Filename: blobclass.h + ** Purpose: Interface to high level classification and training. + ** Author: Dan Johnson + ** History: 5/29/89, DSJ, Created. + ** + ** (c) Copyright Hewlett-Packard Company, 1988. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + ******************************************************************************/ +#ifndef BLOBCLASS_H +#define BLOBCLASS_H + +/**---------------------------------------------------------------------------- + Include Files and Type Defines +----------------------------------------------------------------------------**/ +#include "strngs.h" + +/*--------------------------------------------------------------------------- + Macros +----------------------------------------------------------------------------*/ +/* macros for controlling the display of recognized characters */ +#define EnableCharDisplay() (DisplayCharacters = TRUE) +#define DisableCharDisplay() (DisplayCharacters = FALSE) + +/* macros for controlling the display of the entire match list */ +#define EnableMatchDisplay() (DisplayMatchList = TRUE) +#define DisableMatchDisplay() (DisplayMatchList = FALSE) + +/**---------------------------------------------------------------------------- + Public Function Prototypes +----------------------------------------------------------------------------**/ +namespace tesseract { +// Finds the name of the training font and returns it in fontname, by cutting +// it out based on the expectation that the filename is of the form: +// /path/to/dir/[lang].[fontname].exp[num] +// The [lang], [fontname] and [num] fields should not have '.' characters. +// If the global parameter classify_font_name is set, its value is used instead. +void ExtractFontName(const STRING& filename, STRING* fontname); + +} // namespace tesseract. + +#endif diff --git a/src/classify/float2int.h b/src/classify/float2int.h index 761ae0b034..4f0a21bec9 100644 --- a/src/classify/float2int.h +++ b/src/classify/float2int.h @@ -1,30 +1,30 @@ -/****************************************************************************** - ** Filename: float2int.h - ** Purpose: Routines for converting float features to int features - ** Author: Dan Johnson - ** History: Wed Mar 13 08:06:41 1991, DSJ, Created. - ** - ** (c) Copyright Hewlett-Packard Company, 1988. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - ******************************************************************************/ -#ifndef FLOAT2INT_H -#define FLOAT2INT_H - -/*----------------------------------------------------------------------------- - Include Files and Type Defines ------------------------------------------------------------------------------*/ -#include "intmatcher.h" -#include "ocrfeatures.h" - -#define INT_FEAT_RANGE 256 -#define BASELINE_Y_SHIFT (0.25) - -#endif +/****************************************************************************** + ** Filename: float2int.h + ** Purpose: Routines for converting float features to int features + ** Author: Dan Johnson + ** History: Wed Mar 13 08:06:41 1991, DSJ, Created. + ** + ** (c) Copyright Hewlett-Packard Company, 1988. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + ******************************************************************************/ +#ifndef FLOAT2INT_H +#define FLOAT2INT_H + +/*----------------------------------------------------------------------------- + Include Files and Type Defines +-----------------------------------------------------------------------------*/ +#include "intmatcher.h" +#include "ocrfeatures.h" + +#define INT_FEAT_RANGE 256 +#define BASELINE_Y_SHIFT (0.25) + +#endif diff --git a/src/classify/fpoint.cpp b/src/classify/fpoint.cpp index 80838def08..ff5b7b7cf7 100644 --- a/src/classify/fpoint.cpp +++ b/src/classify/fpoint.cpp @@ -1,61 +1,61 @@ -/****************************************************************************** - ** Filename: fpoint.c - ** Purpose: Abstract data type for a 2D point (floating point coords) - ** Author: Dan Johnson - ** History: Thu Apr 12 10:44:15 1990, DSJ, Created. - ** - ** (c) Copyright Hewlett-Packard Company, 1988. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - ******************************************************************************/ -/*---------------------------------------------------------------------------- - Include Files and Type Defines -----------------------------------------------------------------------------*/ -#include "const.h" -#include "fpoint.h" -#include -#include - -/*---------------------------------------------------------------------------- - Public Code -----------------------------------------------------------------------------*/ - -FLOAT32 DistanceBetween(FPOINT A, FPOINT B) { - double xd = XDelta(A, B); - double yd = YDelta(A, B); - return sqrt(static_cast(xd * xd + yd * yd)); -} - -/** - * Return the angle from Point1 to Point2 normalized to - * lie in the range 0 to FullScale (where FullScale corresponds - * to 2*pi or 360 degrees). - * @param Point1 points to compute angle between - * @param Point2 points to compute angle between - * @param FullScale value to associate with 2*pi - * @return none - * @note Globals: none - * @note Exceptions: none - * @note History: Wed Mar 28 14:27:25 1990, DSJ, Created. - */ -FLOAT32 NormalizedAngleFrom(FPOINT *Point1, - FPOINT *Point2, - FLOAT32 FullScale) { - FLOAT32 Angle; - FLOAT32 NumRadsInCircle = 2.0 * PI; - - Angle = AngleFrom (*Point1, *Point2); - if (Angle < 0.0) - Angle += NumRadsInCircle; - Angle *= FullScale / NumRadsInCircle; - if (Angle < 0.0 || Angle >= FullScale) - Angle = 0.0; - return (Angle); -} +/****************************************************************************** + ** Filename: fpoint.c + ** Purpose: Abstract data type for a 2D point (floating point coords) + ** Author: Dan Johnson + ** History: Thu Apr 12 10:44:15 1990, DSJ, Created. + ** + ** (c) Copyright Hewlett-Packard Company, 1988. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + ******************************************************************************/ +/*---------------------------------------------------------------------------- + Include Files and Type Defines +----------------------------------------------------------------------------*/ +#include "const.h" +#include "fpoint.h" +#include +#include + +/*---------------------------------------------------------------------------- + Public Code +----------------------------------------------------------------------------*/ + +FLOAT32 DistanceBetween(FPOINT A, FPOINT B) { + double xd = XDelta(A, B); + double yd = YDelta(A, B); + return sqrt(static_cast(xd * xd + yd * yd)); +} + +/** + * Return the angle from Point1 to Point2 normalized to + * lie in the range 0 to FullScale (where FullScale corresponds + * to 2*pi or 360 degrees). + * @param Point1 points to compute angle between + * @param Point2 points to compute angle between + * @param FullScale value to associate with 2*pi + * @return none + * @note Globals: none + * @note Exceptions: none + * @note History: Wed Mar 28 14:27:25 1990, DSJ, Created. + */ +FLOAT32 NormalizedAngleFrom(FPOINT *Point1, + FPOINT *Point2, + FLOAT32 FullScale) { + FLOAT32 Angle; + FLOAT32 NumRadsInCircle = 2.0 * PI; + + Angle = AngleFrom (*Point1, *Point2); + if (Angle < 0.0) + Angle += NumRadsInCircle; + Angle *= FullScale / NumRadsInCircle; + if (Angle < 0.0 || Angle >= FullScale) + Angle = 0.0; + return (Angle); +} diff --git a/src/classify/fpoint.h b/src/classify/fpoint.h index ec1ecb96ba..e3fca911aa 100644 --- a/src/classify/fpoint.h +++ b/src/classify/fpoint.h @@ -1,54 +1,54 @@ -/****************************************************************************** - ** Filename: fpoint.h - ** Purpose: Abstract data type for 2D points (floating point coords) - ** Author: Dan Johnson - ** History: Thu Apr 12 10:50:01 1990, DSJ, Created. - ** - ** (c) Copyright Hewlett-Packard Company, 1988. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - ******************************************************************************/ -#ifndef FPOINT_H -#define FPOINT_H - -/**---------------------------------------------------------------------------- - Include Files and Type Defines -----------------------------------------------------------------------------**/ -#include "host.h" -#include -#include - -/* define data structure to hold 2D points or vectors using floating point */ -typedef struct -{ - FLOAT32 x, y; -} FPOINT; -typedef FPOINT FVECTOR; - -/**---------------------------------------------------------------------------- - Macros -----------------------------------------------------------------------------**/ -/* macros for computing miscellaneous functions of 2 points */ -#define XDelta(A,B) ( (B).x - (A).x ) -#define YDelta(A,B) ( (B).y - (A).y ) -#define SlopeFrom(A,B) ( YDelta(A,B) / XDelta(A,B) ) -#define AngleFrom(A,B) ( atan2((double) YDelta(A,B), \ - (double) XDelta(A,B) ) ) - -#define XIntersectionOf(A,B,X) ( SlopeFrom(A,B) * ((X) - A.x) + A.y) - -/*------------------------------------------------------------------------- - Public Function Prototypes ----------------------------------------------------------------------------*/ - -FLOAT32 DistanceBetween(FPOINT A, FPOINT B); - -FLOAT32 NormalizedAngleFrom(FPOINT *Point1, FPOINT *Point2, FLOAT32 FullScale); -#endif +/****************************************************************************** + ** Filename: fpoint.h + ** Purpose: Abstract data type for 2D points (floating point coords) + ** Author: Dan Johnson + ** History: Thu Apr 12 10:50:01 1990, DSJ, Created. + ** + ** (c) Copyright Hewlett-Packard Company, 1988. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + ******************************************************************************/ +#ifndef FPOINT_H +#define FPOINT_H + +/**---------------------------------------------------------------------------- + Include Files and Type Defines +----------------------------------------------------------------------------**/ +#include "host.h" +#include +#include + +/* define data structure to hold 2D points or vectors using floating point */ +typedef struct +{ + FLOAT32 x, y; +} FPOINT; +typedef FPOINT FVECTOR; + +/**---------------------------------------------------------------------------- + Macros +----------------------------------------------------------------------------**/ +/* macros for computing miscellaneous functions of 2 points */ +#define XDelta(A,B) ( (B).x - (A).x ) +#define YDelta(A,B) ( (B).y - (A).y ) +#define SlopeFrom(A,B) ( YDelta(A,B) / XDelta(A,B) ) +#define AngleFrom(A,B) ( atan2((double) YDelta(A,B), \ + (double) XDelta(A,B) ) ) + +#define XIntersectionOf(A,B,X) ( SlopeFrom(A,B) * ((X) - A.x) + A.y) + +/*------------------------------------------------------------------------- + Public Function Prototypes +---------------------------------------------------------------------------*/ + +FLOAT32 DistanceBetween(FPOINT A, FPOINT B); + +FLOAT32 NormalizedAngleFrom(FPOINT *Point1, FPOINT *Point2, FLOAT32 FullScale); +#endif diff --git a/src/classify/intfeaturedist.h b/src/classify/intfeaturedist.h index 26a17530b7..8cfcb3bed5 100644 --- a/src/classify/intfeaturedist.h +++ b/src/classify/intfeaturedist.h @@ -1,80 +1,80 @@ -// Copyright 2011 Google Inc. All Rights Reserved. -// Author: rays@google.com (Ray Smith) -/////////////////////////////////////////////////////////////////////// -// File: intfeaturedist.h -// Description: Fast set-difference-based feature distance calculator. -// Created: Thu Sep 01 12:14:30 PDT 2011 -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -#ifndef TESSERACT_CLASSIFY_INTFEATUREDIST_H_ -#define TESSERACT_CLASSIFY_INTFEATUREDIST_H_ - -#include "genericvector.h" - -namespace tesseract { - -class IntFeatureMap; - -// Feature distance calculator designed to provide a fast distance calculation -// based on set difference between a given feature set and many other feature -// sets in turn. -// Representation of a feature set as an array of bools that are sparsely -// true, and companion arrays that allow fast feature set distance -// calculations with allowance of offsets in position. -// Init is expensive, so for greatest efficiency, to re-initialize for a new -// feature set, use Set(..., false) on the SAME feature set as was used to -// setup with Set(..., true), to return to its initialized state before -// reuse with Set(..., true) on a new feature set. -class IntFeatureDist { - public: - IntFeatureDist(); - ~IntFeatureDist(); - - // Initialize the bool array to the given size of feature space. - // The feature_map is just borrowed, and must exist for the entire - // lifetime of the IntFeatureDist. - void Init(const IntFeatureMap* feature_map); - - // Setup the map for the given indexed_features that have been indexed by - // feature_map. After use, use Set(..., false) to reset to the initial state - // as this is faster than calling Init for sparse spaces. - void Set(const GenericVector& indexed_features, - int canonical_count, bool value); - - // Compute the distance between the given feature vector and the last - // Set feature vector. - double FeatureDistance(const GenericVector& features) const; - double DebugFeatureDistance(const GenericVector& features) const; - - private: - // Clear all data. - void Clear(); - - // Size of the indexed feature space. - int size_; - // Total weight of features currently stored in the maps. - double total_feature_weight_; - // Pointer to IntFeatureMap given at Init to find offset features. - const IntFeatureMap* feature_map_; - // Array of bools indicating presence of a feature. - bool* features_; - // Array indicating the presence of a feature offset by one unit. - bool* features_delta_one_; - // Array indicating the presence of a feature offset by two units. - bool* features_delta_two_; -}; - -} // namespace tesseract - -#endif // TESSERACT_CLASSIFY_INTFEATUREDIST_H_ +// Copyright 2011 Google Inc. All Rights Reserved. +// Author: rays@google.com (Ray Smith) +/////////////////////////////////////////////////////////////////////// +// File: intfeaturedist.h +// Description: Fast set-difference-based feature distance calculator. +// Created: Thu Sep 01 12:14:30 PDT 2011 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +#ifndef TESSERACT_CLASSIFY_INTFEATUREDIST_H_ +#define TESSERACT_CLASSIFY_INTFEATUREDIST_H_ + +#include "genericvector.h" + +namespace tesseract { + +class IntFeatureMap; + +// Feature distance calculator designed to provide a fast distance calculation +// based on set difference between a given feature set and many other feature +// sets in turn. +// Representation of a feature set as an array of bools that are sparsely +// true, and companion arrays that allow fast feature set distance +// calculations with allowance of offsets in position. +// Init is expensive, so for greatest efficiency, to re-initialize for a new +// feature set, use Set(..., false) on the SAME feature set as was used to +// setup with Set(..., true), to return to its initialized state before +// reuse with Set(..., true) on a new feature set. +class IntFeatureDist { + public: + IntFeatureDist(); + ~IntFeatureDist(); + + // Initialize the bool array to the given size of feature space. + // The feature_map is just borrowed, and must exist for the entire + // lifetime of the IntFeatureDist. + void Init(const IntFeatureMap* feature_map); + + // Setup the map for the given indexed_features that have been indexed by + // feature_map. After use, use Set(..., false) to reset to the initial state + // as this is faster than calling Init for sparse spaces. + void Set(const GenericVector& indexed_features, + int canonical_count, bool value); + + // Compute the distance between the given feature vector and the last + // Set feature vector. + double FeatureDistance(const GenericVector& features) const; + double DebugFeatureDistance(const GenericVector& features) const; + + private: + // Clear all data. + void Clear(); + + // Size of the indexed feature space. + int size_; + // Total weight of features currently stored in the maps. + double total_feature_weight_; + // Pointer to IntFeatureMap given at Init to find offset features. + const IntFeatureMap* feature_map_; + // Array of bools indicating presence of a feature. + bool* features_; + // Array indicating the presence of a feature offset by one unit. + bool* features_delta_one_; + // Array indicating the presence of a feature offset by two units. + bool* features_delta_two_; +}; + +} // namespace tesseract + +#endif // TESSERACT_CLASSIFY_INTFEATUREDIST_H_ diff --git a/src/classify/intfeaturemap.h b/src/classify/intfeaturemap.h index 75470c55c1..5c5a54b83c 100644 --- a/src/classify/intfeaturemap.h +++ b/src/classify/intfeaturemap.h @@ -1,163 +1,163 @@ -// Copyright 2010 Google Inc. All Rights Reserved. -// Author: rays@google.com (Ray Smith) -/////////////////////////////////////////////////////////////////////// -// File: intfeaturemap.h -// Description: Encapsulation of IntFeatureSpace with IndexMapBiDi -// to provide a subspace mapping and fast feature lookup. -// Created: Tue Oct 26 08:58:30 PDT 2010 -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -#ifndef TESSERACT_CLASSIFY_INTFEATUREMAP_H_ -#define TESSERACT_CLASSIFY_INTFEATUREMAP_H_ - -#include "intfeaturespace.h" -#include "indexmapbidi.h" -#include "intproto.h" - -namespace tesseract { - -class SampleIterator; - -// Number of positive and negative offset maps. -static const int kNumOffsetMaps = 2; - -// Class to map a feature space defined by INT_FEATURE_STRUCT to a compact -// down-sampled subspace of actually used features. -// The IntFeatureMap copes with 2 stages of transformation: -// The first step is down-sampling (re-quantization) and converting to a -// single index value from the 3-D input: -// INT_FEATURE_STRUCT <-> index feature (via IntFeatureSpace) and -// the second is a feature-space compaction to map only the feature indices -// that are actually used. This saves space in classifiers that are built -// using the mapped feature space. -// index (sparse) feature <-> map (compact) feature via IndexMapBiDi. -// Although the transformations are reversible, the inverses are lossy and do -// not return the exact input INT_FEATURE_STRUCT, due to the many->one nature -// of both transformations. -class IntFeatureMap { - public: - IntFeatureMap(); - ~IntFeatureMap(); - - // Accessors. - int sparse_size() const { - return feature_space_.Size(); - } - int compact_size() const { - return compact_size_; - } - const IntFeatureSpace& feature_space() const { - return feature_space_; - } - const IndexMapBiDi& feature_map() const { - return feature_map_; - } - - // Pseudo-accessors. - int IndexFeature(const INT_FEATURE_STRUCT& f) const; - int MapFeature(const INT_FEATURE_STRUCT& f) const; - int MapIndexFeature(int index_feature) const; - INT_FEATURE_STRUCT InverseIndexFeature(int index_feature) const; - INT_FEATURE_STRUCT InverseMapFeature(int map_feature) const; - void DeleteMapFeature(int map_feature); - bool IsMapFeatureDeleted(int map_feature) const; - - // Copies the given feature_space and uses it as the index feature map - // from INT_FEATURE_STRUCT. - void Init(const IntFeatureSpace& feature_space); - - // Helper to return an offset index feature. In this context an offset - // feature with a dir of +/-1 is a feature of a similar direction, - // but shifted perpendicular to the direction of the feature. An offset - // feature with a dir of +/-2 is feature at the same position, but rotated - // by +/- one [compact] quantum. Returns the index of the generated offset - // feature, or -1 if it doesn't exist. Dir should be in - // [-kNumOffsetMaps, kNumOffsetMaps] to indicate the relative direction. - // A dir of 0 is an identity transformation. - // Both input and output are from the index(sparse) feature space, not - // the mapped/compact feature space, but the offset feature is the minimum - // distance moved from the input to guarantee that it maps to the next - // available quantum in the mapped/compact space. - int OffsetFeature(int index_feature, int dir) const; - - // Computes the features used by the subset of samples defined by - // the iterator and sets up the feature mapping. - // Returns the size of the compacted feature space. - int FindNZFeatureMapping(SampleIterator* it); - - // After deleting some features, finish setting up the mapping, and map - // all the samples. Returns the size of the compacted feature space. - int FinalizeMapping(SampleIterator* it); - - // Indexes the given array of features to a vector of sorted indices. - void IndexAndSortFeatures(const INT_FEATURE_STRUCT* features, - int num_features, - GenericVector* sorted_features) const { - feature_space_.IndexAndSortFeatures(features, num_features, - sorted_features); - } - // Maps the given array of index/sparse features to an array of map/compact - // features. - // Assumes the input is sorted. The output indices are sorted and uniqued. - // Returns the number of "missed" features, being features that - // don't map to the compact feature space. - int MapIndexedFeatures(const GenericVector& index_features, - GenericVector* map_features) const { - return feature_map_.MapFeatures(index_features, map_features); - } - - // Prints the map features from the set in human-readable form. - void DebugMapFeatures(const GenericVector& map_features) const; - - private: - void Clear(); - - // Helper to compute an offset index feature. In this context an offset - // feature with a dir of +/-1 is a feature of a similar direction, - // but shifted perpendicular to the direction of the feature. An offset - // feature with a dir of +/-2 is feature at the same position, but rotated - // by +/- one [compact] quantum. Returns the index of the generated offset - // feature, or -1 if it doesn't exist. Dir should be in - // [-kNumOffsetMaps, kNumOffsetMaps] to indicate the relative direction. - // A dir of 0 is an identity transformation. - // Both input and output are from the index(sparse) feature space, not - // the mapped/compact feature space, but the offset feature is the minimum - // distance moved from the input to guarantee that it maps to the next - // available quantum in the mapped/compact space. - int ComputeOffsetFeature(int index_feature, int dir) const; - - // True if the mapping has changed since it was last finalized. - bool mapping_changed_; - // Size of the compacted feature space, after unused features are removed. - int compact_size_; - // Feature space quantization definition and indexing from INT_FEATURE_STRUCT. - IntFeatureSpace feature_space_; - // Mapping from indexed feature space to the compacted space with unused - // features mapping to -1. - IndexMapBiDi feature_map_; - // Index tables to map a feature index to the corresponding feature after a - // shift perpendicular to the feature direction, or a rotation in place. - // An entry of -1 indicates that there is no corresponding feature. - // Array of arrays of size feature_space_.Size() owned by this class. - int* offset_plus_[kNumOffsetMaps]; - int* offset_minus_[kNumOffsetMaps]; - - // Don't use default copy and assign! - IntFeatureMap(const IntFeatureMap&); - void operator=(const IntFeatureMap&); -}; - -} // namespace tesseract. - -#endif // TESSERACT_CLASSIFY_INTFEATUREMAP_H_ +// Copyright 2010 Google Inc. All Rights Reserved. +// Author: rays@google.com (Ray Smith) +/////////////////////////////////////////////////////////////////////// +// File: intfeaturemap.h +// Description: Encapsulation of IntFeatureSpace with IndexMapBiDi +// to provide a subspace mapping and fast feature lookup. +// Created: Tue Oct 26 08:58:30 PDT 2010 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +#ifndef TESSERACT_CLASSIFY_INTFEATUREMAP_H_ +#define TESSERACT_CLASSIFY_INTFEATUREMAP_H_ + +#include "intfeaturespace.h" +#include "indexmapbidi.h" +#include "intproto.h" + +namespace tesseract { + +class SampleIterator; + +// Number of positive and negative offset maps. +static const int kNumOffsetMaps = 2; + +// Class to map a feature space defined by INT_FEATURE_STRUCT to a compact +// down-sampled subspace of actually used features. +// The IntFeatureMap copes with 2 stages of transformation: +// The first step is down-sampling (re-quantization) and converting to a +// single index value from the 3-D input: +// INT_FEATURE_STRUCT <-> index feature (via IntFeatureSpace) and +// the second is a feature-space compaction to map only the feature indices +// that are actually used. This saves space in classifiers that are built +// using the mapped feature space. +// index (sparse) feature <-> map (compact) feature via IndexMapBiDi. +// Although the transformations are reversible, the inverses are lossy and do +// not return the exact input INT_FEATURE_STRUCT, due to the many->one nature +// of both transformations. +class IntFeatureMap { + public: + IntFeatureMap(); + ~IntFeatureMap(); + + // Accessors. + int sparse_size() const { + return feature_space_.Size(); + } + int compact_size() const { + return compact_size_; + } + const IntFeatureSpace& feature_space() const { + return feature_space_; + } + const IndexMapBiDi& feature_map() const { + return feature_map_; + } + + // Pseudo-accessors. + int IndexFeature(const INT_FEATURE_STRUCT& f) const; + int MapFeature(const INT_FEATURE_STRUCT& f) const; + int MapIndexFeature(int index_feature) const; + INT_FEATURE_STRUCT InverseIndexFeature(int index_feature) const; + INT_FEATURE_STRUCT InverseMapFeature(int map_feature) const; + void DeleteMapFeature(int map_feature); + bool IsMapFeatureDeleted(int map_feature) const; + + // Copies the given feature_space and uses it as the index feature map + // from INT_FEATURE_STRUCT. + void Init(const IntFeatureSpace& feature_space); + + // Helper to return an offset index feature. In this context an offset + // feature with a dir of +/-1 is a feature of a similar direction, + // but shifted perpendicular to the direction of the feature. An offset + // feature with a dir of +/-2 is feature at the same position, but rotated + // by +/- one [compact] quantum. Returns the index of the generated offset + // feature, or -1 if it doesn't exist. Dir should be in + // [-kNumOffsetMaps, kNumOffsetMaps] to indicate the relative direction. + // A dir of 0 is an identity transformation. + // Both input and output are from the index(sparse) feature space, not + // the mapped/compact feature space, but the offset feature is the minimum + // distance moved from the input to guarantee that it maps to the next + // available quantum in the mapped/compact space. + int OffsetFeature(int index_feature, int dir) const; + + // Computes the features used by the subset of samples defined by + // the iterator and sets up the feature mapping. + // Returns the size of the compacted feature space. + int FindNZFeatureMapping(SampleIterator* it); + + // After deleting some features, finish setting up the mapping, and map + // all the samples. Returns the size of the compacted feature space. + int FinalizeMapping(SampleIterator* it); + + // Indexes the given array of features to a vector of sorted indices. + void IndexAndSortFeatures(const INT_FEATURE_STRUCT* features, + int num_features, + GenericVector* sorted_features) const { + feature_space_.IndexAndSortFeatures(features, num_features, + sorted_features); + } + // Maps the given array of index/sparse features to an array of map/compact + // features. + // Assumes the input is sorted. The output indices are sorted and uniqued. + // Returns the number of "missed" features, being features that + // don't map to the compact feature space. + int MapIndexedFeatures(const GenericVector& index_features, + GenericVector* map_features) const { + return feature_map_.MapFeatures(index_features, map_features); + } + + // Prints the map features from the set in human-readable form. + void DebugMapFeatures(const GenericVector& map_features) const; + + private: + void Clear(); + + // Helper to compute an offset index feature. In this context an offset + // feature with a dir of +/-1 is a feature of a similar direction, + // but shifted perpendicular to the direction of the feature. An offset + // feature with a dir of +/-2 is feature at the same position, but rotated + // by +/- one [compact] quantum. Returns the index of the generated offset + // feature, or -1 if it doesn't exist. Dir should be in + // [-kNumOffsetMaps, kNumOffsetMaps] to indicate the relative direction. + // A dir of 0 is an identity transformation. + // Both input and output are from the index(sparse) feature space, not + // the mapped/compact feature space, but the offset feature is the minimum + // distance moved from the input to guarantee that it maps to the next + // available quantum in the mapped/compact space. + int ComputeOffsetFeature(int index_feature, int dir) const; + + // True if the mapping has changed since it was last finalized. + bool mapping_changed_; + // Size of the compacted feature space, after unused features are removed. + int compact_size_; + // Feature space quantization definition and indexing from INT_FEATURE_STRUCT. + IntFeatureSpace feature_space_; + // Mapping from indexed feature space to the compacted space with unused + // features mapping to -1. + IndexMapBiDi feature_map_; + // Index tables to map a feature index to the corresponding feature after a + // shift perpendicular to the feature direction, or a rotation in place. + // An entry of -1 indicates that there is no corresponding feature. + // Array of arrays of size feature_space_.Size() owned by this class. + int* offset_plus_[kNumOffsetMaps]; + int* offset_minus_[kNumOffsetMaps]; + + // Don't use default copy and assign! + IntFeatureMap(const IntFeatureMap&); + void operator=(const IntFeatureMap&); +}; + +} // namespace tesseract. + +#endif // TESSERACT_CLASSIFY_INTFEATUREMAP_H_ diff --git a/src/classify/mf.h b/src/classify/mf.h index d337704e70..4c06a5625b 100644 --- a/src/classify/mf.h +++ b/src/classify/mf.h @@ -1,39 +1,39 @@ -/****************************************************************************** - ** Filename: mf.h - ** Purpose: Micro-feature interface to flexible feature extractor. - ** Author: Dan Johnson - ** History: Thu May 24 09:39:56 1990, DSJ, Created. - ** - ** (c) Copyright Hewlett-Packard Company, 1988. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - ******************************************************************************/ -#ifndef MF_H -#define MF_H - -/**---------------------------------------------------------------------------- - Include Files and Type Defines -----------------------------------------------------------------------------**/ -#include "ocrfeatures.h" -#include "blobs.h" - -typedef enum { - MFXPosition, MFYPosition, - MFLength, MFDirection, MFBulge1, MFBulge2, - MFCount // For array sizes. -} MF_PARAM_NAME; - -typedef float MicroFeature[MFCount]; -/*---------------------------------------------------------------------------- - Private Function Prototypes ------------------------------------------------------------------------------*/ -FEATURE_SET ExtractMicros(TBLOB* Blob, const DENORM& cn_denorm); - -#endif +/****************************************************************************** + ** Filename: mf.h + ** Purpose: Micro-feature interface to flexible feature extractor. + ** Author: Dan Johnson + ** History: Thu May 24 09:39:56 1990, DSJ, Created. + ** + ** (c) Copyright Hewlett-Packard Company, 1988. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + ******************************************************************************/ +#ifndef MF_H +#define MF_H + +/**---------------------------------------------------------------------------- + Include Files and Type Defines +----------------------------------------------------------------------------**/ +#include "ocrfeatures.h" +#include "blobs.h" + +typedef enum { + MFXPosition, MFYPosition, + MFLength, MFDirection, MFBulge1, MFBulge2, + MFCount // For array sizes. +} MF_PARAM_NAME; + +typedef float MicroFeature[MFCount]; +/*---------------------------------------------------------------------------- + Private Function Prototypes +-----------------------------------------------------------------------------*/ +FEATURE_SET ExtractMicros(TBLOB* Blob, const DENORM& cn_denorm); + +#endif diff --git a/src/classify/mfdefs.cpp b/src/classify/mfdefs.cpp index 0ca4b9a11c..54a6e0ad3b 100644 --- a/src/classify/mfdefs.cpp +++ b/src/classify/mfdefs.cpp @@ -1,50 +1,50 @@ -/****************************************************************************** - ** Filename: mfdefs.c - ** Purpose: Basic routines for manipulating micro-features - ** Author: Dan Johnson - ** History: Mon Jan 22 08:48:58 1990, DSJ, Created. - ** - ** (c) Copyright Hewlett-Packard Company, 1988. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - ******************************************************************************/ -/*---------------------------------------------------------------------------- - Include Files and Type Defines -----------------------------------------------------------------------------**/ -#include "mfdefs.h" -#include "emalloc.h" -#include - -/*---------------------------------------------------------------------------- - Public Code -----------------------------------------------------------------------------**/ -/*---------------------------------------------------------------------------*/ -/** - * This routine allocates and returns a new micro-feature - * data structure. - * @return New MICROFEATURE - * @note History: 7/27/89, DSJ, Created. - */ -MICROFEATURE NewMicroFeature() { - return ((MICROFEATURE) Emalloc (sizeof (MFBLOCK))); -} /* NewMicroFeature */ - - -/*---------------------------------------------------------------------------*/ -/** - * This routine deallocates all of the memory consumed by - * a list of micro-features. - * @param MicroFeatures list of micro-features to be freed - * @return none - * @note History: 7/27/89, DSJ, Created. - */ -void FreeMicroFeatures(MICROFEATURES MicroFeatures) { - destroy_nodes(MicroFeatures, Efree); -} /* FreeMicroFeatures */ +/****************************************************************************** + ** Filename: mfdefs.c + ** Purpose: Basic routines for manipulating micro-features + ** Author: Dan Johnson + ** History: Mon Jan 22 08:48:58 1990, DSJ, Created. + ** + ** (c) Copyright Hewlett-Packard Company, 1988. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + ******************************************************************************/ +/*---------------------------------------------------------------------------- + Include Files and Type Defines +----------------------------------------------------------------------------**/ +#include "mfdefs.h" +#include "emalloc.h" +#include + +/*---------------------------------------------------------------------------- + Public Code +----------------------------------------------------------------------------**/ +/*---------------------------------------------------------------------------*/ +/** + * This routine allocates and returns a new micro-feature + * data structure. + * @return New MICROFEATURE + * @note History: 7/27/89, DSJ, Created. + */ +MICROFEATURE NewMicroFeature() { + return ((MICROFEATURE) Emalloc (sizeof (MFBLOCK))); +} /* NewMicroFeature */ + + +/*---------------------------------------------------------------------------*/ +/** + * This routine deallocates all of the memory consumed by + * a list of micro-features. + * @param MicroFeatures list of micro-features to be freed + * @return none + * @note History: 7/27/89, DSJ, Created. + */ +void FreeMicroFeatures(MICROFEATURES MicroFeatures) { + destroy_nodes(MicroFeatures, Efree); +} /* FreeMicroFeatures */ diff --git a/src/classify/mfdefs.h b/src/classify/mfdefs.h index a2e2bb7efd..20a3e2189b 100644 --- a/src/classify/mfdefs.h +++ b/src/classify/mfdefs.h @@ -1,56 +1,56 @@ -/****************************************************************************** - ** Filename: mfdefs.h - ** Purpose: Definition of micro-features - ** Author: Dan Johnson - ** History: Mon Jan 22 08:42:13 1990, DSJ, Created. - ** - ** (c) Copyright Hewlett-Packard Company, 1988. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - ******************************************************************************/ -#ifndef MFDEFS_H -#define MFDEFS_H - -/**---------------------------------------------------------------------------- - Include Files and Type Defines -----------------------------------------------------------------------------**/ -#include "oldlist.h" -#include "matchdefs.h" - -/* definition of a list of micro-features */ -typedef LIST MICROFEATURES; - -/* definition of structure of micro-features */ -#define MFSIZE 6 -typedef FLOAT32 MFBLOCK[MFSIZE]; -typedef FLOAT32 *MICROFEATURE; - -/* definitions of individual micro-feature parameters */ -#define XPOSITION 0 -#define YPOSITION 1 -#define MFLENGTH 2 -#define ORIENTATION 3 -#define FIRSTBULGE 4 -#define SECONDBULGE 5 - -/**---------------------------------------------------------------------------- - Macros -----------------------------------------------------------------------------**/ - -/* macros for accessing micro-feature lists */ -#define NextFeatureOf(L) ( (MICROFEATURE) first_node ( L ) ) - -/**---------------------------------------------------------------------------- - Public Function Prototypes -----------------------------------------------------------------------------**/ -MICROFEATURE NewMicroFeature(); - -void FreeMicroFeatures(MICROFEATURES MicroFeatures); -#endif +/****************************************************************************** + ** Filename: mfdefs.h + ** Purpose: Definition of micro-features + ** Author: Dan Johnson + ** History: Mon Jan 22 08:42:13 1990, DSJ, Created. + ** + ** (c) Copyright Hewlett-Packard Company, 1988. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + ******************************************************************************/ +#ifndef MFDEFS_H +#define MFDEFS_H + +/**---------------------------------------------------------------------------- + Include Files and Type Defines +----------------------------------------------------------------------------**/ +#include "oldlist.h" +#include "matchdefs.h" + +/* definition of a list of micro-features */ +typedef LIST MICROFEATURES; + +/* definition of structure of micro-features */ +#define MFSIZE 6 +typedef FLOAT32 MFBLOCK[MFSIZE]; +typedef FLOAT32 *MICROFEATURE; + +/* definitions of individual micro-feature parameters */ +#define XPOSITION 0 +#define YPOSITION 1 +#define MFLENGTH 2 +#define ORIENTATION 3 +#define FIRSTBULGE 4 +#define SECONDBULGE 5 + +/**---------------------------------------------------------------------------- + Macros +----------------------------------------------------------------------------**/ + +/* macros for accessing micro-feature lists */ +#define NextFeatureOf(L) ( (MICROFEATURE) first_node ( L ) ) + +/**---------------------------------------------------------------------------- + Public Function Prototypes +----------------------------------------------------------------------------**/ +MICROFEATURE NewMicroFeature(); + +void FreeMicroFeatures(MICROFEATURES MicroFeatures); +#endif diff --git a/src/classify/mfoutline.h b/src/classify/mfoutline.h index 1fdb43b1a6..750d83911c 100644 --- a/src/classify/mfoutline.h +++ b/src/classify/mfoutline.h @@ -1,124 +1,124 @@ -/****************************************************************************** - ** Filename: mfoutline.h - ** Purpose: Interface spec for fx outline structures - ** Author: Dan Johnson - ** History: Thu May 17 08:55:32 1990, DSJ, Created. - ** - ** (c) Copyright Hewlett-Packard Company, 1988. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - ******************************************************************************/ -#ifndef MFOUTLINE_H -#define MFOUTLINE_H - -/**---------------------------------------------------------------------------- - Include Files and Type Defines -----------------------------------------------------------------------------**/ -#include "blobs.h" -#include "host.h" -#include "oldlist.h" -#include "fpoint.h" -#include "params.h" - -#define NORMAL_X_HEIGHT (0.5) -#define NORMAL_BASELINE (0.0) - -typedef LIST MFOUTLINE; - -typedef enum { - north, south, east, west, northeast, northwest, southeast, southwest -} DIRECTION; - -typedef struct { - FPOINT Point; - FLOAT32 Slope; - unsigned Padding:20; - BOOL8 Hidden:TRUE; - BOOL8 ExtremityMark:TRUE; - DIRECTION Direction:4; - DIRECTION PreviousDirection:4; -} MFEDGEPT; - -typedef enum { - outer, hole -} OUTLINETYPE; - -typedef enum { - baseline, character -} NORM_METHOD; - -/**---------------------------------------------------------------------------- - Macros -----------------------------------------------------------------------------**/ -#define AverageOf(A,B) (((A) + (B)) / 2) - -/* macro for computing the scale factor to use to normalize characters */ -#define MF_SCALE_FACTOR (NORMAL_X_HEIGHT / kBlnXHeight) - -/* macros for manipulating micro-feature outlines */ -#define DegenerateOutline(O) (((O) == NIL_LIST) || ((O) == list_rest(O))) -#define PointAt(O) ((MFEDGEPT *) first_node (O)) -#define NextPointAfter(E) (list_rest (E)) -#define MakeOutlineCircular(O) (set_rest (last (O), (O))) - -/* macros for manipulating micro-feature outline edge points */ -#define ClearMark(P) ((P)->ExtremityMark = FALSE) -#define MarkPoint(P) ((P)->ExtremityMark = TRUE) - -/**---------------------------------------------------------------------------- - Public Function Prototypes -----------------------------------------------------------------------------**/ -void ComputeBlobCenter(TBLOB *Blob, TPOINT *BlobCenter); - -LIST ConvertBlob(TBLOB *Blob); - -MFOUTLINE ConvertOutline(TESSLINE *Outline); - -LIST ConvertOutlines(TESSLINE *Outline, - LIST ConvertedOutlines, - OUTLINETYPE OutlineType); - -void FilterEdgeNoise(MFOUTLINE Outline, FLOAT32 NoiseSegmentLength); - -void FindDirectionChanges(MFOUTLINE Outline, - FLOAT32 MinSlope, - FLOAT32 MaxSlope); - -void FreeMFOutline(void *agr); //MFOUTLINE Outline); - -void FreeOutlines(LIST Outlines); - -void MarkDirectionChanges(MFOUTLINE Outline); - -MFEDGEPT *NewEdgePoint(); - -MFOUTLINE NextExtremity(MFOUTLINE EdgePoint); - -void NormalizeOutline(MFOUTLINE Outline, - FLOAT32 XOrigin); - -/*---------------------------------------------------------------------------- - Private Function Prototypes ------------------------------------------------------------------------------*/ -void ChangeDirection(MFOUTLINE Start, MFOUTLINE End, DIRECTION Direction); - -// Normalizes the Outline in-place using cn_denorm's local transformation, -// then converts from the integer feature range [0,255] to the clusterer -// feature range of [-0.5, 0.5]. -void CharNormalizeOutline(MFOUTLINE Outline, const DENORM& cn_denorm); - -void ComputeDirection(MFEDGEPT *Start, - MFEDGEPT *Finish, - FLOAT32 MinSlope, - FLOAT32 MaxSlope); - -MFOUTLINE NextDirectionChange(MFOUTLINE EdgePoint); - -#endif +/****************************************************************************** + ** Filename: mfoutline.h + ** Purpose: Interface spec for fx outline structures + ** Author: Dan Johnson + ** History: Thu May 17 08:55:32 1990, DSJ, Created. + ** + ** (c) Copyright Hewlett-Packard Company, 1988. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + ******************************************************************************/ +#ifndef MFOUTLINE_H +#define MFOUTLINE_H + +/**---------------------------------------------------------------------------- + Include Files and Type Defines +----------------------------------------------------------------------------**/ +#include "blobs.h" +#include "host.h" +#include "oldlist.h" +#include "fpoint.h" +#include "params.h" + +#define NORMAL_X_HEIGHT (0.5) +#define NORMAL_BASELINE (0.0) + +typedef LIST MFOUTLINE; + +typedef enum { + north, south, east, west, northeast, northwest, southeast, southwest +} DIRECTION; + +typedef struct { + FPOINT Point; + FLOAT32 Slope; + unsigned Padding:20; + BOOL8 Hidden:TRUE; + BOOL8 ExtremityMark:TRUE; + DIRECTION Direction:4; + DIRECTION PreviousDirection:4; +} MFEDGEPT; + +typedef enum { + outer, hole +} OUTLINETYPE; + +typedef enum { + baseline, character +} NORM_METHOD; + +/**---------------------------------------------------------------------------- + Macros +----------------------------------------------------------------------------**/ +#define AverageOf(A,B) (((A) + (B)) / 2) + +/* macro for computing the scale factor to use to normalize characters */ +#define MF_SCALE_FACTOR (NORMAL_X_HEIGHT / kBlnXHeight) + +/* macros for manipulating micro-feature outlines */ +#define DegenerateOutline(O) (((O) == NIL_LIST) || ((O) == list_rest(O))) +#define PointAt(O) ((MFEDGEPT *) first_node (O)) +#define NextPointAfter(E) (list_rest (E)) +#define MakeOutlineCircular(O) (set_rest (last (O), (O))) + +/* macros for manipulating micro-feature outline edge points */ +#define ClearMark(P) ((P)->ExtremityMark = FALSE) +#define MarkPoint(P) ((P)->ExtremityMark = TRUE) + +/**---------------------------------------------------------------------------- + Public Function Prototypes +----------------------------------------------------------------------------**/ +void ComputeBlobCenter(TBLOB *Blob, TPOINT *BlobCenter); + +LIST ConvertBlob(TBLOB *Blob); + +MFOUTLINE ConvertOutline(TESSLINE *Outline); + +LIST ConvertOutlines(TESSLINE *Outline, + LIST ConvertedOutlines, + OUTLINETYPE OutlineType); + +void FilterEdgeNoise(MFOUTLINE Outline, FLOAT32 NoiseSegmentLength); + +void FindDirectionChanges(MFOUTLINE Outline, + FLOAT32 MinSlope, + FLOAT32 MaxSlope); + +void FreeMFOutline(void *agr); //MFOUTLINE Outline); + +void FreeOutlines(LIST Outlines); + +void MarkDirectionChanges(MFOUTLINE Outline); + +MFEDGEPT *NewEdgePoint(); + +MFOUTLINE NextExtremity(MFOUTLINE EdgePoint); + +void NormalizeOutline(MFOUTLINE Outline, + FLOAT32 XOrigin); + +/*---------------------------------------------------------------------------- + Private Function Prototypes +-----------------------------------------------------------------------------*/ +void ChangeDirection(MFOUTLINE Start, MFOUTLINE End, DIRECTION Direction); + +// Normalizes the Outline in-place using cn_denorm's local transformation, +// then converts from the integer feature range [0,255] to the clusterer +// feature range of [-0.5, 0.5]. +void CharNormalizeOutline(MFOUTLINE Outline, const DENORM& cn_denorm); + +void ComputeDirection(MFEDGEPT *Start, + MFEDGEPT *Finish, + FLOAT32 MinSlope, + FLOAT32 MaxSlope); + +MFOUTLINE NextDirectionChange(MFOUTLINE EdgePoint); + +#endif diff --git a/src/classify/mfx.h b/src/classify/mfx.h index 8aa50190f2..5ed006dcc7 100644 --- a/src/classify/mfx.h +++ b/src/classify/mfx.h @@ -1,41 +1,41 @@ -/****************************************************************************** - ** Filename: mfx.h - ** Purpose: Definition of micro-feature extraction routines - ** Author: Dan Johnson - ** History: 5/29/89, DSJ, Created. - ** - ** (c) Copyright Hewlett-Packard Company, 1988. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - ******************************************************************************/ -#ifndef MFX_H -#define MFX_H - -/*---------------------------------------------------------------------------- - Include Files and Type Defines -----------------------------------------------------------------------------**/ -#include "mfdefs.h" -#include "params.h" -/*---------------------------------------------------------------------------- - Variables -----------------------------------------------------------------------------**/ - -/* old numbers corresponded to 10.0 degrees and 80.0 degrees */ -extern double_VAR_H(classify_min_slope, 0.414213562, - "Slope below which lines are called horizontal"); -extern double_VAR_H(classify_max_slope, 2.414213562, - "Slope above which lines are called vertical"); - -/*---------------------------------------------------------------------------- - Public Function Prototypes -----------------------------------------------------------------------------**/ -MICROFEATURES BlobMicroFeatures(TBLOB* Blob, const DENORM& cn_denorm); - -#endif +/****************************************************************************** + ** Filename: mfx.h + ** Purpose: Definition of micro-feature extraction routines + ** Author: Dan Johnson + ** History: 5/29/89, DSJ, Created. + ** + ** (c) Copyright Hewlett-Packard Company, 1988. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + ******************************************************************************/ +#ifndef MFX_H +#define MFX_H + +/*---------------------------------------------------------------------------- + Include Files and Type Defines +----------------------------------------------------------------------------**/ +#include "mfdefs.h" +#include "params.h" +/*---------------------------------------------------------------------------- + Variables +----------------------------------------------------------------------------**/ + +/* old numbers corresponded to 10.0 degrees and 80.0 degrees */ +extern double_VAR_H(classify_min_slope, 0.414213562, + "Slope below which lines are called horizontal"); +extern double_VAR_H(classify_max_slope, 2.414213562, + "Slope above which lines are called vertical"); + +/*---------------------------------------------------------------------------- + Public Function Prototypes +----------------------------------------------------------------------------**/ +MICROFEATURES BlobMicroFeatures(TBLOB* Blob, const DENORM& cn_denorm); + +#endif diff --git a/src/classify/normfeat.cpp b/src/classify/normfeat.cpp index 6b5fb07989..f297b3b05d 100644 --- a/src/classify/normfeat.cpp +++ b/src/classify/normfeat.cpp @@ -1,75 +1,75 @@ -/****************************************************************************** - ** Filename: normfeat.c - ** Purpose: Definition of char normalization features. - ** Author: Dan Johnson - ** History: 12/14/90, DSJ, Created. - ** - ** (c) Copyright Hewlett-Packard Company, 1988. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - ******************************************************************************/ -/*---------------------------------------------------------------------------- - Include Files and Type Defines -----------------------------------------------------------------------------*/ -#include "normfeat.h" - -#include "intfx.h" -#include "featdefs.h" -#include "mfoutline.h" - -/*---------------------------------------------------------------------------- - Public Code -----------------------------------------------------------------------------*/ - -/** Return the length of the outline in baseline normalized form. */ -FLOAT32 ActualOutlineLength(FEATURE Feature) { - return (Feature->Params[CharNormLength] * LENGTH_COMPRESSION); -} - -/** - * Return the character normalization feature for a blob. - * - * The features returned are in a scale where the x-height has been - * normalized to live in the region y = [-0.25 .. 0.25]. Example ranges - * for English below are based on the Linux font collection on 2009-12-04: - * - * - Params[CharNormY] - * - The y coordinate of the grapheme's centroid. - * - English: [-0.27, 0.71] - * - * - Params[CharNormLength] - * - The length of the grapheme's outline (tiny segments discarded), - * divided by 10.0=LENGTH_COMPRESSION. - * - English: [0.16, 0.85] - * - * - Params[CharNormRx] - * - The radius of gyration about the x axis, as measured from CharNormY. - * - English: [0.011, 0.34] - * - * - Params[CharNormRy] - * - The radius of gyration about the y axis, as measured from - * the x center of the grapheme's bounding box. - * - English: [0.011, 0.31] - */ -FEATURE_SET ExtractCharNormFeatures(const INT_FX_RESULT_STRUCT& fx_info) { - FEATURE_SET feature_set = NewFeatureSet(1); - FEATURE feature = NewFeature(&CharNormDesc); - - feature->Params[CharNormY] = - MF_SCALE_FACTOR * (fx_info.Ymean - kBlnBaselineOffset); - feature->Params[CharNormLength] = - MF_SCALE_FACTOR * fx_info.Length / LENGTH_COMPRESSION; - feature->Params[CharNormRx] = MF_SCALE_FACTOR * fx_info.Rx; - feature->Params[CharNormRy] = MF_SCALE_FACTOR * fx_info.Ry; - - AddFeature(feature_set, feature); - - return feature_set; -} /* ExtractCharNormFeatures */ +/****************************************************************************** + ** Filename: normfeat.c + ** Purpose: Definition of char normalization features. + ** Author: Dan Johnson + ** History: 12/14/90, DSJ, Created. + ** + ** (c) Copyright Hewlett-Packard Company, 1988. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + ******************************************************************************/ +/*---------------------------------------------------------------------------- + Include Files and Type Defines +----------------------------------------------------------------------------*/ +#include "normfeat.h" + +#include "intfx.h" +#include "featdefs.h" +#include "mfoutline.h" + +/*---------------------------------------------------------------------------- + Public Code +----------------------------------------------------------------------------*/ + +/** Return the length of the outline in baseline normalized form. */ +FLOAT32 ActualOutlineLength(FEATURE Feature) { + return (Feature->Params[CharNormLength] * LENGTH_COMPRESSION); +} + +/** + * Return the character normalization feature for a blob. + * + * The features returned are in a scale where the x-height has been + * normalized to live in the region y = [-0.25 .. 0.25]. Example ranges + * for English below are based on the Linux font collection on 2009-12-04: + * + * - Params[CharNormY] + * - The y coordinate of the grapheme's centroid. + * - English: [-0.27, 0.71] + * + * - Params[CharNormLength] + * - The length of the grapheme's outline (tiny segments discarded), + * divided by 10.0=LENGTH_COMPRESSION. + * - English: [0.16, 0.85] + * + * - Params[CharNormRx] + * - The radius of gyration about the x axis, as measured from CharNormY. + * - English: [0.011, 0.34] + * + * - Params[CharNormRy] + * - The radius of gyration about the y axis, as measured from + * the x center of the grapheme's bounding box. + * - English: [0.011, 0.31] + */ +FEATURE_SET ExtractCharNormFeatures(const INT_FX_RESULT_STRUCT& fx_info) { + FEATURE_SET feature_set = NewFeatureSet(1); + FEATURE feature = NewFeature(&CharNormDesc); + + feature->Params[CharNormY] = + MF_SCALE_FACTOR * (fx_info.Ymean - kBlnBaselineOffset); + feature->Params[CharNormLength] = + MF_SCALE_FACTOR * fx_info.Length / LENGTH_COMPRESSION; + feature->Params[CharNormRx] = MF_SCALE_FACTOR * fx_info.Rx; + feature->Params[CharNormRy] = MF_SCALE_FACTOR * fx_info.Ry; + + AddFeature(feature_set, feature); + + return feature_set; +} /* ExtractCharNormFeatures */ diff --git a/src/classify/normfeat.h b/src/classify/normfeat.h index 7ef7681ae3..1478b827d4 100644 --- a/src/classify/normfeat.h +++ b/src/classify/normfeat.h @@ -1,39 +1,39 @@ -/****************************************************************************** - ** Filename: normfeat.h - ** Purpose: Definition of character normalization features. - ** Author: Dan Johnson - ** History: 12/14/90, DSJ, Created. - ** - ** (c) Copyright Hewlett-Packard Company, 1988. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - ******************************************************************************/ -#ifndef NORMFEAT_H -#define NORMFEAT_H - -/**---------------------------------------------------------------------------- - Include Files and Type Defines -----------------------------------------------------------------------------**/ -#include "ocrfeatures.h" - -#define LENGTH_COMPRESSION (10.0) - -typedef enum { - CharNormY, CharNormLength, CharNormRx, CharNormRy -} NORM_PARAM_NAME; - -/**---------------------------------------------------------------------------- - Public Function Prototypes -----------------------------------------------------------------------------**/ -FLOAT32 ActualOutlineLength(FEATURE Feature); - -FEATURE_SET ExtractCharNormFeatures(const INT_FX_RESULT_STRUCT& fx_info); - -#endif +/****************************************************************************** + ** Filename: normfeat.h + ** Purpose: Definition of character normalization features. + ** Author: Dan Johnson + ** History: 12/14/90, DSJ, Created. + ** + ** (c) Copyright Hewlett-Packard Company, 1988. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + ******************************************************************************/ +#ifndef NORMFEAT_H +#define NORMFEAT_H + +/**---------------------------------------------------------------------------- + Include Files and Type Defines +----------------------------------------------------------------------------**/ +#include "ocrfeatures.h" + +#define LENGTH_COMPRESSION (10.0) + +typedef enum { + CharNormY, CharNormLength, CharNormRx, CharNormRy +} NORM_PARAM_NAME; + +/**---------------------------------------------------------------------------- + Public Function Prototypes +----------------------------------------------------------------------------**/ +FLOAT32 ActualOutlineLength(FEATURE Feature); + +FEATURE_SET ExtractCharNormFeatures(const INT_FX_RESULT_STRUCT& fx_info); + +#endif diff --git a/src/classify/normmatch.h b/src/classify/normmatch.h index 447785a3e1..cdec0fd966 100644 --- a/src/classify/normmatch.h +++ b/src/classify/normmatch.h @@ -1,37 +1,37 @@ -/****************************************************************************** - ** Filename: normmatch.h - ** Purpose: Simple matcher based on character normalization features. - ** Author: Dan Johnson - ** History: Thu Dec 20 08:55:05 1990, DSJ, Created. - ** - ** (c) Copyright Hewlett-Packard Company, 1988. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - ******************************************************************************/ -#ifndef NORMMATCH_H -#define NORMMATCH_H - -/**---------------------------------------------------------------------------- - Include Files and Type Defines -----------------------------------------------------------------------------**/ -#include "matchdefs.h" -#include "ocrfeatures.h" -#include "params.h" - -/**---------------------------------------------------------------------------- - Variables -----------------------------------------------------------------------------**/ - -/* control knobs used to control the normalization adjustment process */ -extern double_VAR_H(classify_norm_adj_midpoint, 32.0, - "Norm adjust midpoint ..."); -extern double_VAR_H(classify_norm_adj_curl, 2.0, "Norm adjust curl ..."); - -#endif +/****************************************************************************** + ** Filename: normmatch.h + ** Purpose: Simple matcher based on character normalization features. + ** Author: Dan Johnson + ** History: Thu Dec 20 08:55:05 1990, DSJ, Created. + ** + ** (c) Copyright Hewlett-Packard Company, 1988. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + ******************************************************************************/ +#ifndef NORMMATCH_H +#define NORMMATCH_H + +/**---------------------------------------------------------------------------- + Include Files and Type Defines +----------------------------------------------------------------------------**/ +#include "matchdefs.h" +#include "ocrfeatures.h" +#include "params.h" + +/**---------------------------------------------------------------------------- + Variables +----------------------------------------------------------------------------**/ + +/* control knobs used to control the normalization adjustment process */ +extern double_VAR_H(classify_norm_adj_midpoint, 32.0, + "Norm adjust midpoint ..."); +extern double_VAR_H(classify_norm_adj_curl, 2.0, "Norm adjust curl ..."); + +#endif diff --git a/src/classify/ocrfeatures.cpp b/src/classify/ocrfeatures.cpp index 8da48e1039..8008d4aff7 100644 --- a/src/classify/ocrfeatures.cpp +++ b/src/classify/ocrfeatures.cpp @@ -1,244 +1,244 @@ -/****************************************************************************** - ** Filename: features.c - ** Purpose: Generic definition of a feature. - ** Author: Dan Johnson - ** History: Mon May 21 10:49:04 1990, DSJ, Created. - ** - ** (c) Copyright Hewlett-Packard Company, 1988. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - ******************************************************************************/ -/*---------------------------------------------------------------------------- - Include Files and Type Defines -----------------------------------------------------------------------------*/ -#include "ocrfeatures.h" -#include "emalloc.h" -#include "callcpp.h" -#include "danerror.h" -#include "scanutils.h" - -#include -#include - -/*---------------------------------------------------------------------------- - Public Code -----------------------------------------------------------------------------*/ -/** - * Add a feature to a feature set. If the feature set is - * already full, FALSE is returned to indicate that the - * feature could not be added to the set; otherwise, TRUE is - * returned. - * @param FeatureSet set of features to add Feature to - * @param Feature feature to be added to FeatureSet - * @return TRUE if feature added to set, FALSE if set is already full. - * @note History: Tue May 22 17:22:23 1990, DSJ, Created. - */ -BOOL8 AddFeature(FEATURE_SET FeatureSet, FEATURE Feature) { - if (FeatureSet->NumFeatures >= FeatureSet->MaxNumFeatures) { - FreeFeature(Feature); - return FALSE; - } - - FeatureSet->Features[FeatureSet->NumFeatures++] = Feature; - return TRUE; -} /* AddFeature */ - -/** - * Release the memory consumed by the specified feature. - * @param Feature feature to be deallocated. - * @return none - * @note History: Mon May 21 13:33:27 1990, DSJ, Created. - */ -void FreeFeature(FEATURE Feature) { free(Feature); } /* FreeFeature */ - -/** - * Release the memory consumed by the specified feature - * set. This routine also frees the memory consumed by the - * features contained in the set. - * @param FeatureSet set of features to be freed - * @return none - * @note History: Mon May 21 13:59:46 1990, DSJ, Created. - */ -void FreeFeatureSet(FEATURE_SET FeatureSet) { - int i; - - if (FeatureSet) { - for (i = 0; i < FeatureSet->NumFeatures; i++) - FreeFeature(FeatureSet->Features[i]); - free(FeatureSet); - } -} /* FreeFeatureSet */ - -/** - * Allocate and return a new feature of the specified - * type. - * @param FeatureDesc description of feature to be created. - * @return New #FEATURE. - * @note History: Mon May 21 14:06:42 1990, DSJ, Created. - */ -FEATURE NewFeature(const FEATURE_DESC_STRUCT* FeatureDesc) { - FEATURE Feature; - - Feature = (FEATURE)malloc(sizeof(FEATURE_STRUCT) + - (FeatureDesc->NumParams - 1) * sizeof(FLOAT32)); - Feature->Type = FeatureDesc; - return (Feature); - -} /* NewFeature */ - -/** - * Allocate and return a new feature set large enough to - * hold the specified number of features. - * @param NumFeatures maximum # of features to be put in feature set - * @return New #FEATURE_SET. - * @note History: Mon May 21 14:22:40 1990, DSJ, Created. - */ -FEATURE_SET NewFeatureSet(int NumFeatures) { - FEATURE_SET FeatureSet; - - FeatureSet = (FEATURE_SET) Emalloc (sizeof (FEATURE_SET_STRUCT) + - (NumFeatures - 1) * sizeof (FEATURE)); - FeatureSet->MaxNumFeatures = NumFeatures; - FeatureSet->NumFeatures = 0; - return (FeatureSet); - -} /* NewFeatureSet */ - -/** - * Create a new feature of the specified type and read in - * the value of its parameters from File. The extra penalty - * for the feature is also computed by calling the appropriate - * function for the specified feature type. The correct text - * representation for a feature is a list of N floats where - * N is the number of parameters in the feature. - * @param File open text file to read feature from - * @param FeatureDesc specifies type of feature to read from File - * @return New #FEATURE read from File. - * @note Exceptions: #ILLEGAL_FEATURE_PARAM if text file doesn't match expected - * format - * @note History: Wed May 23 08:53:16 1990, DSJ, Created. - */ -FEATURE ReadFeature(FILE* File, const FEATURE_DESC_STRUCT* FeatureDesc) { - FEATURE Feature; - int i; - - Feature = NewFeature (FeatureDesc); - for (i = 0; i < Feature->Type->NumParams; i++) { - if (tfscanf(File, "%f", &(Feature->Params[i])) != 1) - DoError (ILLEGAL_FEATURE_PARAM, "Illegal feature parameter spec"); -#ifndef _WIN32 - assert (!isnan(Feature->Params[i])); -#endif - } - return (Feature); -} /* ReadFeature */ - -/** - * Create a new feature set of the specified type and read in - * the features from File. The correct text representation - * for a feature set is an integer which specifies the number (N) - * of features in a set followed by a list of N feature - * descriptions. - * @param File open text file to read new feature set from - * @param FeatureDesc specifies type of feature to read from File - * @return New feature set read from File. - * @note History: Wed May 23 09:17:31 1990, DSJ, Created. - */ -FEATURE_SET ReadFeatureSet(FILE* File, const FEATURE_DESC_STRUCT* FeatureDesc) { - FEATURE_SET FeatureSet; - int NumFeatures; - int i; - - if (tfscanf(File, "%d", &NumFeatures) != 1 || NumFeatures < 0) - DoError(ILLEGAL_NUM_FEATURES, "Illegal number of features in set"); - - FeatureSet = NewFeatureSet(NumFeatures); - for (i = 0; i < NumFeatures; i++) - AddFeature(FeatureSet, ReadFeature (File, FeatureDesc)); - - return (FeatureSet); -} /* ReadFeatureSet */ - -/** - * Appends a textual representation of Feature to str. - * This representation is simply a list of the N parameters - * of the feature, terminated with a newline. It is assumed - * that the ExtraPenalty field can be reconstructed from the - * parameters of the feature. It is also assumed that the - * feature type information is specified or assumed elsewhere. - * @param Feature feature to write out to str - * @param str string to write Feature to - * @return none - * @note History: Wed May 23 09:28:18 1990, DSJ, Created. - */ -void WriteFeature(FEATURE Feature, STRING* str) { - for (int i = 0; i < Feature->Type->NumParams; i++) { -#ifndef WIN32 - assert(!isnan(Feature->Params[i])); -#endif - str->add_str_double(" ", Feature->Params[i]); - } - *str += "\n"; -} /* WriteFeature */ - -/** - * Write a textual representation of FeatureSet to File. - * This representation is an integer specifying the number of - * features in the set, followed by a newline, followed by - * text representations for each feature in the set. - * @param FeatureSet feature set to write to File - * @param str string to write Feature to - * @return none - * @note History: Wed May 23 10:06:03 1990, DSJ, Created. - */ -void WriteFeatureSet(FEATURE_SET FeatureSet, STRING* str) { - if (FeatureSet) { - str->add_str_int("", FeatureSet->NumFeatures); - *str += "\n"; - for (int i = 0; i < FeatureSet->NumFeatures; i++) { - WriteFeature(FeatureSet->Features[i], str); - } - } -} /* WriteFeatureSet */ - -/** - * Write a textual representation of FeatureDesc to File - * in the old format (i.e. the format used by the clusterer). - * - * This format is: - * @verbatim - * Number of Params - * Description of Param 1 - * ... - * @endverbatim - * @param File open text file to write FeatureDesc to - * @param FeatureDesc feature descriptor to write to File - * @return none - * @note History: Fri May 25 15:27:18 1990, DSJ, Created. - */ -void WriteOldParamDesc(FILE* File, const FEATURE_DESC_STRUCT* FeatureDesc) { - int i; - - fprintf (File, "%d\n", FeatureDesc->NumParams); - for (i = 0; i < FeatureDesc->NumParams; i++) { - if (FeatureDesc->ParamDesc[i].Circular) - fprintf (File, "circular "); - else - fprintf (File, "linear "); - - if (FeatureDesc->ParamDesc[i].NonEssential) - fprintf (File, "non-essential "); - else - fprintf (File, "essential "); - - fprintf (File, "%f %f\n", - FeatureDesc->ParamDesc[i].Min, FeatureDesc->ParamDesc[i].Max); - } -} /* WriteOldParamDesc */ +/****************************************************************************** + ** Filename: features.c + ** Purpose: Generic definition of a feature. + ** Author: Dan Johnson + ** History: Mon May 21 10:49:04 1990, DSJ, Created. + ** + ** (c) Copyright Hewlett-Packard Company, 1988. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + ******************************************************************************/ +/*---------------------------------------------------------------------------- + Include Files and Type Defines +----------------------------------------------------------------------------*/ +#include "ocrfeatures.h" +#include "emalloc.h" +#include "callcpp.h" +#include "danerror.h" +#include "scanutils.h" + +#include +#include + +/*---------------------------------------------------------------------------- + Public Code +----------------------------------------------------------------------------*/ +/** + * Add a feature to a feature set. If the feature set is + * already full, FALSE is returned to indicate that the + * feature could not be added to the set; otherwise, TRUE is + * returned. + * @param FeatureSet set of features to add Feature to + * @param Feature feature to be added to FeatureSet + * @return TRUE if feature added to set, FALSE if set is already full. + * @note History: Tue May 22 17:22:23 1990, DSJ, Created. + */ +BOOL8 AddFeature(FEATURE_SET FeatureSet, FEATURE Feature) { + if (FeatureSet->NumFeatures >= FeatureSet->MaxNumFeatures) { + FreeFeature(Feature); + return FALSE; + } + + FeatureSet->Features[FeatureSet->NumFeatures++] = Feature; + return TRUE; +} /* AddFeature */ + +/** + * Release the memory consumed by the specified feature. + * @param Feature feature to be deallocated. + * @return none + * @note History: Mon May 21 13:33:27 1990, DSJ, Created. + */ +void FreeFeature(FEATURE Feature) { free(Feature); } /* FreeFeature */ + +/** + * Release the memory consumed by the specified feature + * set. This routine also frees the memory consumed by the + * features contained in the set. + * @param FeatureSet set of features to be freed + * @return none + * @note History: Mon May 21 13:59:46 1990, DSJ, Created. + */ +void FreeFeatureSet(FEATURE_SET FeatureSet) { + int i; + + if (FeatureSet) { + for (i = 0; i < FeatureSet->NumFeatures; i++) + FreeFeature(FeatureSet->Features[i]); + free(FeatureSet); + } +} /* FreeFeatureSet */ + +/** + * Allocate and return a new feature of the specified + * type. + * @param FeatureDesc description of feature to be created. + * @return New #FEATURE. + * @note History: Mon May 21 14:06:42 1990, DSJ, Created. + */ +FEATURE NewFeature(const FEATURE_DESC_STRUCT* FeatureDesc) { + FEATURE Feature; + + Feature = (FEATURE)malloc(sizeof(FEATURE_STRUCT) + + (FeatureDesc->NumParams - 1) * sizeof(FLOAT32)); + Feature->Type = FeatureDesc; + return (Feature); + +} /* NewFeature */ + +/** + * Allocate and return a new feature set large enough to + * hold the specified number of features. + * @param NumFeatures maximum # of features to be put in feature set + * @return New #FEATURE_SET. + * @note History: Mon May 21 14:22:40 1990, DSJ, Created. + */ +FEATURE_SET NewFeatureSet(int NumFeatures) { + FEATURE_SET FeatureSet; + + FeatureSet = (FEATURE_SET) Emalloc (sizeof (FEATURE_SET_STRUCT) + + (NumFeatures - 1) * sizeof (FEATURE)); + FeatureSet->MaxNumFeatures = NumFeatures; + FeatureSet->NumFeatures = 0; + return (FeatureSet); + +} /* NewFeatureSet */ + +/** + * Create a new feature of the specified type and read in + * the value of its parameters from File. The extra penalty + * for the feature is also computed by calling the appropriate + * function for the specified feature type. The correct text + * representation for a feature is a list of N floats where + * N is the number of parameters in the feature. + * @param File open text file to read feature from + * @param FeatureDesc specifies type of feature to read from File + * @return New #FEATURE read from File. + * @note Exceptions: #ILLEGAL_FEATURE_PARAM if text file doesn't match expected + * format + * @note History: Wed May 23 08:53:16 1990, DSJ, Created. + */ +FEATURE ReadFeature(FILE* File, const FEATURE_DESC_STRUCT* FeatureDesc) { + FEATURE Feature; + int i; + + Feature = NewFeature (FeatureDesc); + for (i = 0; i < Feature->Type->NumParams; i++) { + if (tfscanf(File, "%f", &(Feature->Params[i])) != 1) + DoError (ILLEGAL_FEATURE_PARAM, "Illegal feature parameter spec"); +#ifndef _WIN32 + assert (!isnan(Feature->Params[i])); +#endif + } + return (Feature); +} /* ReadFeature */ + +/** + * Create a new feature set of the specified type and read in + * the features from File. The correct text representation + * for a feature set is an integer which specifies the number (N) + * of features in a set followed by a list of N feature + * descriptions. + * @param File open text file to read new feature set from + * @param FeatureDesc specifies type of feature to read from File + * @return New feature set read from File. + * @note History: Wed May 23 09:17:31 1990, DSJ, Created. + */ +FEATURE_SET ReadFeatureSet(FILE* File, const FEATURE_DESC_STRUCT* FeatureDesc) { + FEATURE_SET FeatureSet; + int NumFeatures; + int i; + + if (tfscanf(File, "%d", &NumFeatures) != 1 || NumFeatures < 0) + DoError(ILLEGAL_NUM_FEATURES, "Illegal number of features in set"); + + FeatureSet = NewFeatureSet(NumFeatures); + for (i = 0; i < NumFeatures; i++) + AddFeature(FeatureSet, ReadFeature (File, FeatureDesc)); + + return (FeatureSet); +} /* ReadFeatureSet */ + +/** + * Appends a textual representation of Feature to str. + * This representation is simply a list of the N parameters + * of the feature, terminated with a newline. It is assumed + * that the ExtraPenalty field can be reconstructed from the + * parameters of the feature. It is also assumed that the + * feature type information is specified or assumed elsewhere. + * @param Feature feature to write out to str + * @param str string to write Feature to + * @return none + * @note History: Wed May 23 09:28:18 1990, DSJ, Created. + */ +void WriteFeature(FEATURE Feature, STRING* str) { + for (int i = 0; i < Feature->Type->NumParams; i++) { +#ifndef WIN32 + assert(!isnan(Feature->Params[i])); +#endif + str->add_str_double(" ", Feature->Params[i]); + } + *str += "\n"; +} /* WriteFeature */ + +/** + * Write a textual representation of FeatureSet to File. + * This representation is an integer specifying the number of + * features in the set, followed by a newline, followed by + * text representations for each feature in the set. + * @param FeatureSet feature set to write to File + * @param str string to write Feature to + * @return none + * @note History: Wed May 23 10:06:03 1990, DSJ, Created. + */ +void WriteFeatureSet(FEATURE_SET FeatureSet, STRING* str) { + if (FeatureSet) { + str->add_str_int("", FeatureSet->NumFeatures); + *str += "\n"; + for (int i = 0; i < FeatureSet->NumFeatures; i++) { + WriteFeature(FeatureSet->Features[i], str); + } + } +} /* WriteFeatureSet */ + +/** + * Write a textual representation of FeatureDesc to File + * in the old format (i.e. the format used by the clusterer). + * + * This format is: + * @verbatim + * Number of Params + * Description of Param 1 + * ... + * @endverbatim + * @param File open text file to write FeatureDesc to + * @param FeatureDesc feature descriptor to write to File + * @return none + * @note History: Fri May 25 15:27:18 1990, DSJ, Created. + */ +void WriteOldParamDesc(FILE* File, const FEATURE_DESC_STRUCT* FeatureDesc) { + int i; + + fprintf (File, "%d\n", FeatureDesc->NumParams); + for (i = 0; i < FeatureDesc->NumParams; i++) { + if (FeatureDesc->ParamDesc[i].Circular) + fprintf (File, "circular "); + else + fprintf (File, "linear "); + + if (FeatureDesc->ParamDesc[i].NonEssential) + fprintf (File, "non-essential "); + else + fprintf (File, "essential "); + + fprintf (File, "%f %f\n", + FeatureDesc->ParamDesc[i].Min, FeatureDesc->ParamDesc[i].Max); + } +} /* WriteOldParamDesc */ diff --git a/src/classify/outfeat.h b/src/classify/outfeat.h index ec5908008f..e7a36476ef 100644 --- a/src/classify/outfeat.h +++ b/src/classify/outfeat.h @@ -1,48 +1,48 @@ -/****************************************************************************** - ** Filename: outfeat.h - ** Purpose: Definition of outline features. - ** Author: Dan Johnson - ** History: 11/13/90, DSJ, Created. - ** - ** (c) Copyright Hewlett-Packard Company, 1988. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - ******************************************************************************/ -#ifndef OUTFEAT_H -#define OUTFEAT_H - -/**---------------------------------------------------------------------------- - Include Files and Type Defines -----------------------------------------------------------------------------**/ -#include "ocrfeatures.h" -#include "fpoint.h" -#include "mfoutline.h" - -typedef enum { - OutlineFeatX, - OutlineFeatY, - OutlineFeatLength, - OutlineFeatDir -} OUTLINE_FEAT_PARAM_NAME; - -#define MAX_OUTLINE_FEATURES (100) - -/*--------------------------------------------------------------------------- - Privat Function Prototypes -----------------------------------------------------------------------------*/ -void AddOutlineFeatureToSet(FPOINT *Start, - FPOINT *End, - FEATURE_SET FeatureSet); - -void ConvertToOutlineFeatures(MFOUTLINE Outline, FEATURE_SET FeatureSet); - -void NormalizeOutlineX(FEATURE_SET FeatureSet); - -#endif +/****************************************************************************** + ** Filename: outfeat.h + ** Purpose: Definition of outline features. + ** Author: Dan Johnson + ** History: 11/13/90, DSJ, Created. + ** + ** (c) Copyright Hewlett-Packard Company, 1988. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + ******************************************************************************/ +#ifndef OUTFEAT_H +#define OUTFEAT_H + +/**---------------------------------------------------------------------------- + Include Files and Type Defines +----------------------------------------------------------------------------**/ +#include "ocrfeatures.h" +#include "fpoint.h" +#include "mfoutline.h" + +typedef enum { + OutlineFeatX, + OutlineFeatY, + OutlineFeatLength, + OutlineFeatDir +} OUTLINE_FEAT_PARAM_NAME; + +#define MAX_OUTLINE_FEATURES (100) + +/*--------------------------------------------------------------------------- + Privat Function Prototypes +----------------------------------------------------------------------------*/ +void AddOutlineFeatureToSet(FPOINT *Start, + FPOINT *End, + FEATURE_SET FeatureSet); + +void ConvertToOutlineFeatures(MFOUTLINE Outline, FEATURE_SET FeatureSet); + +void NormalizeOutlineX(FEATURE_SET FeatureSet); + +#endif diff --git a/src/classify/picofeat.h b/src/classify/picofeat.h index 58202683a3..966ffc32e7 100644 --- a/src/classify/picofeat.h +++ b/src/classify/picofeat.h @@ -1,65 +1,65 @@ -/****************************************************************************** - ** Filename: picofeat.h - ** Purpose: Definition of pico features. - ** Author: Dan Johnson - ** History: 9/4/90, DSJ, Created. - ** - ** (c) Copyright Hewlett-Packard Company, 1988. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - ******************************************************************************/ -#ifndef PICOFEAT_H -#define PICOFEAT_H - -/**---------------------------------------------------------------------------- - Include Files and Type Defines -----------------------------------------------------------------------------**/ -#include "ocrfeatures.h" -#include "params.h" - -// Enum for the order/type of params in IntFeatDesc. -enum IntParams { - IntX, // x-position (0-255). - IntY, // y-position (0-255). - IntDir // Direction (0-255, circular). -}; - -// Enum for the order/type of params in GeoFeatDesc. -enum GeoParams { - GeoBottom, // Bounding box bottom in baseline space (0-255). - GeoTop, // Bounding box top in baseline space (0-255). - GeoWidth, // Bounding box width in baseline space (0-255). - - GeoCount // Number of geo features. -}; - -typedef enum -{ PicoFeatY, PicoFeatDir, PicoFeatX } -PICO_FEAT_PARAM_NAME; - -#define MAX_PICO_FEATURES (1000) - -/*--------------------------------------------------------------------------- - Variables -----------------------------------------------------------------------------*/ - -extern double_VAR_H(classify_pico_feature_length, 0.05, "Pico Feature Length"); - - -/**---------------------------------------------------------------------------- - Public Function Prototypes -----------------------------------------------------------------------------**/ -#define GetPicoFeatureLength() (PicoFeatureLength) - -/**---------------------------------------------------------------------------- - Global Data Definitions and Declarations -----------------------------------------------------------------------------**/ -extern TESS_API FLOAT32 PicoFeatureLength; -#endif +/****************************************************************************** + ** Filename: picofeat.h + ** Purpose: Definition of pico features. + ** Author: Dan Johnson + ** History: 9/4/90, DSJ, Created. + ** + ** (c) Copyright Hewlett-Packard Company, 1988. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + ******************************************************************************/ +#ifndef PICOFEAT_H +#define PICOFEAT_H + +/**---------------------------------------------------------------------------- + Include Files and Type Defines +----------------------------------------------------------------------------**/ +#include "ocrfeatures.h" +#include "params.h" + +// Enum for the order/type of params in IntFeatDesc. +enum IntParams { + IntX, // x-position (0-255). + IntY, // y-position (0-255). + IntDir // Direction (0-255, circular). +}; + +// Enum for the order/type of params in GeoFeatDesc. +enum GeoParams { + GeoBottom, // Bounding box bottom in baseline space (0-255). + GeoTop, // Bounding box top in baseline space (0-255). + GeoWidth, // Bounding box width in baseline space (0-255). + + GeoCount // Number of geo features. +}; + +typedef enum +{ PicoFeatY, PicoFeatDir, PicoFeatX } +PICO_FEAT_PARAM_NAME; + +#define MAX_PICO_FEATURES (1000) + +/*--------------------------------------------------------------------------- + Variables +----------------------------------------------------------------------------*/ + +extern double_VAR_H(classify_pico_feature_length, 0.05, "Pico Feature Length"); + + +/**---------------------------------------------------------------------------- + Public Function Prototypes +----------------------------------------------------------------------------**/ +#define GetPicoFeatureLength() (PicoFeatureLength) + +/**---------------------------------------------------------------------------- + Global Data Definitions and Declarations +----------------------------------------------------------------------------**/ +extern TESS_API FLOAT32 PicoFeatureLength; +#endif diff --git a/src/cutil/const.h b/src/cutil/const.h index ac4fc19af2..33f8fa443c 100644 --- a/src/cutil/const.h +++ b/src/cutil/const.h @@ -1,23 +1,23 @@ -/************************************************************************** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. -**************************************************************************/ - -#ifndef CONST_H -#define CONST_H - -/*This file contains constants which are global to the entire system*/ -#define SPLINESIZE 23 // max spline parts to a line - -#define PI 3.14159265359 // pi - -#define EDGEPTFLAGS 4 // concavity,length etc. - -#endif +/************************************************************************** + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. +**************************************************************************/ + +#ifndef CONST_H +#define CONST_H + +/*This file contains constants which are global to the entire system*/ +#define SPLINESIZE 23 // max spline parts to a line + +#define PI 3.14159265359 // pi + +#define EDGEPTFLAGS 4 // concavity,length etc. + +#endif diff --git a/src/cutil/cutil.h b/src/cutil/cutil.h index 91669178a0..41d3599aca 100644 --- a/src/cutil/cutil.h +++ b/src/cutil/cutil.h @@ -1,115 +1,115 @@ -/* -*-C-*- - ******************************************************************************** - * - * File: cutil.h - * Description: General utility functions - * Author: Mark Seaman, SW Productivity - * Created: Fri Oct 16 14:37:00 1987 - * Modified: Wed Dec 5 15:40:26 1990 (Mark Seaman) marks@hpgrlt - * Language: C - * Package: N/A - * Status: Reusable Software Component - * - * (c) Copyright 1987, Hewlett-Packard Company. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - ******************************************************************************** -Revision 1.1 2007/02/02 23:39:07 theraysmith -Fixed portability issues - -Revision 1.1.1.1 2004/02/20 19:39:06 slumos -Import original HP distribution - -*/ - -#ifndef CUTILH -#define CUTILH - -/*---------------------------------------------------------------------- - I n c l u d e s -----------------------------------------------------------------------*/ -#include -#include -#include - -#include "host.h" -#include "tprintf.h" - -/*---------------------------------------------------------------------- - T y p e s -----------------------------------------------------------------------*/ -#ifndef TRUE -#define TRUE 1 -#endif - -#ifndef FALSE -#define FALSE 0 -#endif - -#define CHARS_PER_LINE 500 - -#if defined(__STDC__) || defined(__cplusplus) -# define _ARGS(s) s -#else -# define _ARGS(s) () -#endif - -//typedef int (*int_proc) (void); -typedef void (*void_proc) (...); -typedef void *(*void_star_proc) _ARGS ((...)); - -typedef int (*int_void) (void); -typedef void (*void_void) (void); -typedef int (*int_compare) (void *, void *); -typedef void (*void_dest) (void *); - -/*---------------------------------------------------------------------- - M a c r o s -----------------------------------------------------------------------*/ -/********************************************************************** - * new_line - * - * Print a new line character on stdout. - **********************************************************************/ - -#define new_line() \ - tprintf("\n") - -/********************************************************************** - * print_string - * - * Print a string on stdout. - **********************************************************************/ - -#define print_string(str) \ - printf ("%s\n", str) - -/*---------------------------------------------------------------------- - F u n c t i o n s -----------------------------------------------------------------------*/ -long long_rand(long limit); - -FILE *open_file(const char *filename, const char *mode); - -bool exists_file(const char *filename); - -/* util.c -long long_rand - _ARGS ((long limit)); - -FILE *open_file - _ARGS((char *filename, - char *mode)); - -#undef _ARGS -*/ -#include "cutil_class.h" -#endif +/* -*-C-*- + ******************************************************************************** + * + * File: cutil.h + * Description: General utility functions + * Author: Mark Seaman, SW Productivity + * Created: Fri Oct 16 14:37:00 1987 + * Modified: Wed Dec 5 15:40:26 1990 (Mark Seaman) marks@hpgrlt + * Language: C + * Package: N/A + * Status: Reusable Software Component + * + * (c) Copyright 1987, Hewlett-Packard Company. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + ******************************************************************************** +Revision 1.1 2007/02/02 23:39:07 theraysmith +Fixed portability issues + +Revision 1.1.1.1 2004/02/20 19:39:06 slumos +Import original HP distribution + +*/ + +#ifndef CUTILH +#define CUTILH + +/*---------------------------------------------------------------------- + I n c l u d e s +----------------------------------------------------------------------*/ +#include +#include +#include + +#include "host.h" +#include "tprintf.h" + +/*---------------------------------------------------------------------- + T y p e s +----------------------------------------------------------------------*/ +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#define CHARS_PER_LINE 500 + +#if defined(__STDC__) || defined(__cplusplus) +# define _ARGS(s) s +#else +# define _ARGS(s) () +#endif + +//typedef int (*int_proc) (void); +typedef void (*void_proc) (...); +typedef void *(*void_star_proc) _ARGS ((...)); + +typedef int (*int_void) (void); +typedef void (*void_void) (void); +typedef int (*int_compare) (void *, void *); +typedef void (*void_dest) (void *); + +/*---------------------------------------------------------------------- + M a c r o s +----------------------------------------------------------------------*/ +/********************************************************************** + * new_line + * + * Print a new line character on stdout. + **********************************************************************/ + +#define new_line() \ + tprintf("\n") + +/********************************************************************** + * print_string + * + * Print a string on stdout. + **********************************************************************/ + +#define print_string(str) \ + printf ("%s\n", str) + +/*---------------------------------------------------------------------- + F u n c t i o n s +----------------------------------------------------------------------*/ +long long_rand(long limit); + +FILE *open_file(const char *filename, const char *mode); + +bool exists_file(const char *filename); + +/* util.c +long long_rand + _ARGS ((long limit)); + +FILE *open_file + _ARGS((char *filename, + char *mode)); + +#undef _ARGS +*/ +#include "cutil_class.h" +#endif diff --git a/src/cutil/cutil_class.cpp b/src/cutil/cutil_class.cpp index 740d036d23..7e493cf10d 100644 --- a/src/cutil/cutil_class.cpp +++ b/src/cutil/cutil_class.cpp @@ -1,29 +1,29 @@ -/////////////////////////////////////////////////////////////////////// -// File: cutil_class.cpp -// Description: cutil class. -// Author: Samuel Charron -// -// (C) Copyright 2006, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -#include "cutil_class.h" - -namespace tesseract { - -CUtil::CUtil() { -} - -CUtil::~CUtil() { -} - -} // namespace tesseract +/////////////////////////////////////////////////////////////////////// +// File: cutil_class.cpp +// Description: cutil class. +// Author: Samuel Charron +// +// (C) Copyright 2006, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +#include "cutil_class.h" + +namespace tesseract { + +CUtil::CUtil() { +} + +CUtil::~CUtil() { +} + +} // namespace tesseract diff --git a/src/cutil/cutil_class.h b/src/cutil/cutil_class.h index efada7cae8..5f3b299b1a 100644 --- a/src/cutil/cutil_class.h +++ b/src/cutil/cutil_class.h @@ -1,37 +1,37 @@ -/////////////////////////////////////////////////////////////////////// -// File: cutil_class.h -// Description: cutil class. -// Author: Samuel Charron -// -// (C) Copyright 2006, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -#ifndef TESSERACT_CUTIL_CUTIL_CLASS_H_ -#define TESSERACT_CUTIL_CUTIL_CLASS_H_ - -#include "ccutil.h" -#include "const.h" -#include "strngs.h" - -namespace tesseract { - -class CUtil : public CCUtil { - public: - CUtil(); - ~CUtil(); - void read_variables(const char *filename, bool global_only); -}; - -} // namespace tesseract - -#endif // TESSERACT_CUTIL_CUTIL_CLASS_H_ +/////////////////////////////////////////////////////////////////////// +// File: cutil_class.h +// Description: cutil class. +// Author: Samuel Charron +// +// (C) Copyright 2006, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +#ifndef TESSERACT_CUTIL_CUTIL_CLASS_H_ +#define TESSERACT_CUTIL_CUTIL_CLASS_H_ + +#include "ccutil.h" +#include "const.h" +#include "strngs.h" + +namespace tesseract { + +class CUtil : public CCUtil { + public: + CUtil(); + ~CUtil(); + void read_variables(const char *filename, bool global_only); +}; + +} // namespace tesseract + +#endif // TESSERACT_CUTIL_CUTIL_CLASS_H_ diff --git a/src/cutil/danerror.h b/src/cutil/danerror.h index a5da3463d9..0a42ccac57 100644 --- a/src/cutil/danerror.h +++ b/src/cutil/danerror.h @@ -1,35 +1,35 @@ -/****************************************************************************** - ** Filename: danerror.h - ** Purpose: Definition of error trapping routines. - ** Author: Dan Johnson - ** History: 4/3/89, DSJ, Created. - ** - ** (c) Copyright Hewlett-Packard Company, 1988. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - ******************************************************************************/ -#ifndef DANERROR_H -#define DANERROR_H - -/**---------------------------------------------------------------------------- - Include Files and Type Defines -----------------------------------------------------------------------------**/ -#define NOERROR 0 -#define DO_NOTHING 0 - -typedef int TRAPERROR; -typedef void (*VOID_PROC) (); - -/**---------------------------------------------------------------------------- - Public Function Prototypes -----------------------------------------------------------------------------**/ -void DoError(int Error, const char *Message); - -#endif +/****************************************************************************** + ** Filename: danerror.h + ** Purpose: Definition of error trapping routines. + ** Author: Dan Johnson + ** History: 4/3/89, DSJ, Created. + ** + ** (c) Copyright Hewlett-Packard Company, 1988. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + ******************************************************************************/ +#ifndef DANERROR_H +#define DANERROR_H + +/**---------------------------------------------------------------------------- + Include Files and Type Defines +----------------------------------------------------------------------------**/ +#define NOERROR 0 +#define DO_NOTHING 0 + +typedef int TRAPERROR; +typedef void (*VOID_PROC) (); + +/**---------------------------------------------------------------------------- + Public Function Prototypes +----------------------------------------------------------------------------**/ +void DoError(int Error, const char *Message); + +#endif diff --git a/src/cutil/efio.h b/src/cutil/efio.h index 3277369c24..1617af0bf2 100644 --- a/src/cutil/efio.h +++ b/src/cutil/efio.h @@ -1,32 +1,32 @@ -/****************************************************************************** - ** Filename: efio.h - ** Purpose: Definition of file I/O routines - ** Author: Dan Johnson - ** History: 5/21/89, DSJ, Created. - ** - ** (c) Copyright Hewlett-Packard Company, 1988. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - ******************************************************************************/ -#ifndef EFIO_H -#define EFIO_H - -/**---------------------------------------------------------------------------- - Include Files and Type Defines -----------------------------------------------------------------------------**/ -#include - -#define FOPENERROR 3000 - -/**---------------------------------------------------------------------------- - Public Function Prototype -----------------------------------------------------------------------------**/ -FILE *Efopen(const char *Name, const char *Mode); -#endif +/****************************************************************************** + ** Filename: efio.h + ** Purpose: Definition of file I/O routines + ** Author: Dan Johnson + ** History: 5/21/89, DSJ, Created. + ** + ** (c) Copyright Hewlett-Packard Company, 1988. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + ******************************************************************************/ +#ifndef EFIO_H +#define EFIO_H + +/**---------------------------------------------------------------------------- + Include Files and Type Defines +----------------------------------------------------------------------------**/ +#include + +#define FOPENERROR 3000 + +/**---------------------------------------------------------------------------- + Public Function Prototype +----------------------------------------------------------------------------**/ +FILE *Efopen(const char *Name, const char *Mode); +#endif diff --git a/src/cutil/emalloc.h b/src/cutil/emalloc.h index 4e4f821c3d..6fda20a596 100644 --- a/src/cutil/emalloc.h +++ b/src/cutil/emalloc.h @@ -1,44 +1,44 @@ -/****************************************************************************** - ** Filename: emalloc.h - ** Purpose: Definition of memory allocation routines. - ** Author: Dan Johnson - ** History: 4/3/89, DSJ, Created. - ** - ** (c) Copyright Hewlett-Packard Company, 1988. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - ******************************************************************************/ -#ifndef EMALLOC_H -#define EMALLOC_H - -/**---------------------------------------------------------------------------- - Include Files and Type Defines -----------------------------------------------------------------------------**/ -#include "host.h" -#include "callcpp.h" - -#define NOTENOUGHMEMORY 2000 -#define ILLEGALMALLOCREQUEST 2001 - -/**---------------------------------------------------------------------------- - Public Function Prototypes -----------------------------------------------------------------------------**/ -void *Emalloc(int Size); - -void *Erealloc(void *ptr, int size); - -void Efree(void *ptr); - - -/**---------------------------------------------------------------------------- - Global Data Definitions and Declarations -----------------------------------------------------------------------------**/ - -#endif +/****************************************************************************** + ** Filename: emalloc.h + ** Purpose: Definition of memory allocation routines. + ** Author: Dan Johnson + ** History: 4/3/89, DSJ, Created. + ** + ** (c) Copyright Hewlett-Packard Company, 1988. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + ******************************************************************************/ +#ifndef EMALLOC_H +#define EMALLOC_H + +/**---------------------------------------------------------------------------- + Include Files and Type Defines +----------------------------------------------------------------------------**/ +#include "host.h" +#include "callcpp.h" + +#define NOTENOUGHMEMORY 2000 +#define ILLEGALMALLOCREQUEST 2001 + +/**---------------------------------------------------------------------------- + Public Function Prototypes +----------------------------------------------------------------------------**/ +void *Emalloc(int Size); + +void *Erealloc(void *ptr, int size); + +void Efree(void *ptr); + + +/**---------------------------------------------------------------------------- + Global Data Definitions and Declarations +----------------------------------------------------------------------------**/ + +#endif diff --git a/src/cutil/globals.h b/src/cutil/globals.h index 5050a5c1ef..3907697e9e 100644 --- a/src/cutil/globals.h +++ b/src/cutil/globals.h @@ -1,35 +1,35 @@ -/* -*-C-*- - ******************************************************************************** - * - * File: globals.h (Formerly globals.h) - * Description: Global Variables for Wise Owl - * Author: Mark Seaman, OCR Technology - * Created: Thu Dec 21 11:38:36 1989 - * Modified: Thu Jan 4 17:13:00 1990 (Mark Seaman) marks@hpgrlt - * Language: C - * Package: N/A - * Status: Experimental (Do Not Distribute) - * - * (c) Copyright 1989, Hewlett-Packard Company. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - *********************************************************************************/ -#ifndef GLOBALS_H -#define GLOBALS_H - -#include "const.h" -#include "unicharset.h" -#include "strngs.h" - -#include - - -#endif +/* -*-C-*- + ******************************************************************************** + * + * File: globals.h (Formerly globals.h) + * Description: Global Variables for Wise Owl + * Author: Mark Seaman, OCR Technology + * Created: Thu Dec 21 11:38:36 1989 + * Modified: Thu Jan 4 17:13:00 1990 (Mark Seaman) marks@hpgrlt + * Language: C + * Package: N/A + * Status: Experimental (Do Not Distribute) + * + * (c) Copyright 1989, Hewlett-Packard Company. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + *********************************************************************************/ +#ifndef GLOBALS_H +#define GLOBALS_H + +#include "const.h" +#include "unicharset.h" +#include "strngs.h" + +#include + + +#endif diff --git a/src/cutil/oldlist.h b/src/cutil/oldlist.h index b850eda625..bd4fdfa16f 100644 --- a/src/cutil/oldlist.h +++ b/src/cutil/oldlist.h @@ -1,354 +1,354 @@ -/* -*-C-*- - ******************************************************************************** - * - * File: oldlist.h (Formerly list.h) - * Description: List processing procedures declarations. - * Author: Mark Seaman, SW Productivity - * Created: Fri Oct 16 14:37:00 1987 - * Modified: Wed Dec 5 15:43:17 1990 (Mark Seaman) marks@hpgrlt - * Language: C - * Package: N/A - * Status: Reusable Software Component - * - * (c) Copyright 1987, Hewlett-Packard Company. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - ******************************************************************************** - * - * This file contains the interface for a set of general purpose list - * manipulation routines. For the implementation of these routines see - * the file "list.c". - * - ******************************************************************************** - * - * INDEX - * ======= - * - * BASICS: - * ------- - * first_node - Macro to return the first list node (not the cell). - * list_rest - Macro the return the second list cell - * pop - Destroy one list cell - * push - Create one list cell and set the node and next fields - * - * ITERATION: - * ----------------- - * iterate - Macro to create a for loop to visit each cell. - * iterate_list - Macro to visit each cell using a local variable. - * for_each - Applies a function to each node. - * - * LIST CELL COUNTS: - * ----------------- - * count - Returns the number of list cells in the list. - * second_node - Returns the second node. - * third - Returns the third node. - * fourth - Returns the fourth node. - * fifth - Returns the fifth node. - * last - Returns the last list cell. - * pair - Creates a list of two elements. - * - * COPYING: - * ----------------- - * copy_first - Pushes the first element from list 1 onto list 2. - * copy - Create a copy of a list. - * concat - Creates a new list that is a copy of both input lists. - * delete_n - Creates a new list without the chosen elements. - * reverse - Creates a backwards copy of the input list. - * sort - Use quick sort to construct a new list. - * transform - Creates a new list by transforming each of the nodes. - * - * TRANFORMS: (Note: These functions all modify the input list.) - * ---------- - * join - Concatenates list 1 and list 2. - * delete_d - Removes the requested elements from the list. - * transform_d - Modifies the list by applying a function to each node. - * insert - Add a new element into this spot in a list. (not - *NIL_LIST) push_last - Add a new element onto the end of a list. - * reverse_d - Reverse a list and destroy the old one. - * - * ASSOCIATED LISTS: - * ----------------- - * adelete - Remove a particular entry from an associated list. - * assoc - Find an entry in an associated list that matches a key. - * match - Return the data element of an a-list entry. - * - * DISPLAY: - * ----------------- - * print_cell - Print a hex dump of a list cell. - * show - Displays a string and a list (using lprint). - * - * SETS: - * ----- - * adjoin - Add a new element to list if it does not exist already. - * intersection - Create a new list that is the set intersection. - * set_union - Create a new list that is the set intersection. - * set_difference - Create a new list that is the set difference. - * s_adjoin - Add an element to a sort list if it is not there. - * s_intersection - Set intersection on a sorted list. Modifies old list. - * s_union - Set intersection on a sorted list. Modifies old list. - * search - Return the pointer to the list cell whose node matches. - * - * COMPARISONS: - * ----------------- - * is_same - Compares each node to the key. - * is_not_same - Compares each node to the key. - * is_key - Compares first of each node to the key. - * is_not_key - Compares first of each node to the key. - * - * CELL OPERATIONS: - * ----------------- - * new_cell - Obtain a new list cell from the free list. Allocate. - * free_cell - Return a list cell to the free list. - * destroy - Return all list cells in a list. - * destroy_nodes - Apply a function to each list cell and destroy the list. - * set_node - Assign the node field in a list cell. - * set_rest - Assign the next field in a list cell. - * - ***********************************************************************/ - -#ifndef LIST_H -#define LIST_H - -#include "cutil.h" -#include "tesscallback.h" - -/*---------------------------------------------------------------------- - T y p e s -----------------------------------------------------------------------*/ -#define NIL_LIST (LIST) 0 -struct list_rec -{ - struct list_rec *node; - struct list_rec *next; -}; -typedef list_rec *LIST; - -/*---------------------------------------------------------------------- - M a c r o s -----------------------------------------------------------------------*/ -/* Predefinitions */ -#define list_rest(l) ((l) ? (l)->next : NIL_LIST) -#define first_node(l) ((l) ? (l)->node : NIL_LIST) - -/********************************************************************** - * c o p y f i r s t - * - * Do the appropriate kind a push operation to copy the first node from - * one list to another. - * - **********************************************************************/ - -#define copy_first(l1,l2) \ -(l2=push(l2, first_node(l1))) - -/********************************************************************** - * i t e r a t e - * - * Visit each node in the list. Replace the old list with the list - * minus the head. Continue until the list is NIL_LIST. - **********************************************************************/ - -#define iterate(l) \ -for (; (l) != NIL_LIST; (l) = list_rest (l)) - -/********************************************************************** - * i t e r a t e l i s t - * - * Visit each node in the list (l). Use a local variable (x) to iterate - * through all of the list cells. This macro is identical to iterate - * except that it does not lose the original list. - **********************************************************************/ - -#define iterate_list(x,l) \ -for ((x)=(l); (x)!=0; (x)=list_rest(x)) - -/********************************************************************** - * j o i n o n - * - * Add another list onto the tail of this one. The list given as an input - * parameter is modified. - **********************************************************************/ - -#define JOIN_ON(list1,list2) \ -((list1) = join ((list1), (list2))) - -/********************************************************************** - * p o p o f f - * - * Add a cell onto the front of a list. The list given as an input - * parameter is modified. - **********************************************************************/ - -#define pop_off(list) \ -((list) = pop (list)) - -/********************************************************************** - * p u s h o n - * - * Add a cell onto the front of a list. The list given as an input - * parameter is modified. - **********************************************************************/ - -#define push_on(list,thing) \ -((list) = push (list, (LIST) (thing))) - -/********************************************************************** - * s e c o n d - * - * Return the contents of the second list element. - * - * #define second_node(l) first_node (list_rest (l)) - **********************************************************************/ - -#define second_node(l) \ -first_node (list_rest (l)) - -/********************************************************************** - * s e t r e s t - * - * Change the "next" field of a list element to point to a desired place. - * - * #define set_rest(l,node) l->next = node; - **********************************************************************/ - -#define set_rest(l,cell)\ -((l)->next = (cell)) - -/********************************************************************** - * t h i r d - * - * Return the contents of the third list element. - * - * #define third(l) first_node (list_rest (list_rest (l))) - **********************************************************************/ - -#define third(l) \ -first_node (list_rest (list_rest (l))) - -/*---------------------------------------------------------------------- - Public Function Prototypes -----------------------------------------------------------------------*/ -int count(LIST var_list); - -LIST delete_d(LIST list, void *key, int_compare is_equal); - -LIST delete_d(LIST list, void *key, - TessResultCallback2* is_equal); - -LIST destroy(LIST list); - -void destroy_nodes(LIST list, void_dest destructor); - -void insert(LIST list, void *node); - -int is_same(void *item1, void *item2); - -LIST join(LIST list1, LIST list2); - -LIST last(LIST var_list); - -void *nth_cell(LIST var_list, int item_num); - -LIST pop(LIST list); - -LIST push(LIST list, void *element); - -LIST push_last(LIST list, void *item); - -LIST reverse(LIST list); - -LIST reverse_d(LIST list); - -LIST s_adjoin(LIST var_list, void *variable, int_compare compare); - -LIST search(LIST list, void *key, int_compare is_equal); - -LIST search(LIST list, void *key, TessResultCallback2*); - -/* -#if defined(__STDC__) || defined(__cplusplus) -# define _ARGS(s) s -#else -# define _ARGS(s) () -#endif - -typedef void (*destructor) _ARGS((LIST l)); - -typedef LIST (*list_proc) _ARGS((LIST a)); - -int count -_ARGS((LIST var_list)); - -LIST delete_d -_ARGS((LIST list, - LIST key, - int_compare is_equal)); - -LIST destroy -_ARGS((LIST list)); - -LIST destroy_nodes -_ARGS((LIST list, - void_dest destructor)); - -void insert -_ARGS((LIST list, - LIST node)); - -int is_same_node -_ARGS((LIST s1, - LIST s2)); - -int is_same -_ARGS((LIST s1, - LIST s2)); - -LIST join -_ARGS((LIST list1, - LIST list2)); - -LIST last -_ARGS((LIST var_list)); - -LIST nth_cell -_ARGS((LIST var_list, - int item_num)); - -LIST pop -_ARGS((LIST list)); - -LIST push -_ARGS((LIST list, - LIST element)); - -LIST push_last -_ARGS((LIST list, - LIST item)); - -LIST reverse -_ARGS((LIST list)); - -LIST reverse_d -_ARGS((LIST list)); - -LIST s_adjoin -_ARGS((LIST var_list, - LIST variable, - int_compare compare)); - -LIST search -_ARGS((LIST list, - LIST key, - int_compare is_equal)); - -#undef _ARGS -*/ -#endif +/* -*-C-*- + ******************************************************************************** + * + * File: oldlist.h (Formerly list.h) + * Description: List processing procedures declarations. + * Author: Mark Seaman, SW Productivity + * Created: Fri Oct 16 14:37:00 1987 + * Modified: Wed Dec 5 15:43:17 1990 (Mark Seaman) marks@hpgrlt + * Language: C + * Package: N/A + * Status: Reusable Software Component + * + * (c) Copyright 1987, Hewlett-Packard Company. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + ******************************************************************************** + * + * This file contains the interface for a set of general purpose list + * manipulation routines. For the implementation of these routines see + * the file "list.c". + * + ******************************************************************************** + * + * INDEX + * ======= + * + * BASICS: + * ------- + * first_node - Macro to return the first list node (not the cell). + * list_rest - Macro the return the second list cell + * pop - Destroy one list cell + * push - Create one list cell and set the node and next fields + * + * ITERATION: + * ----------------- + * iterate - Macro to create a for loop to visit each cell. + * iterate_list - Macro to visit each cell using a local variable. + * for_each - Applies a function to each node. + * + * LIST CELL COUNTS: + * ----------------- + * count - Returns the number of list cells in the list. + * second_node - Returns the second node. + * third - Returns the third node. + * fourth - Returns the fourth node. + * fifth - Returns the fifth node. + * last - Returns the last list cell. + * pair - Creates a list of two elements. + * + * COPYING: + * ----------------- + * copy_first - Pushes the first element from list 1 onto list 2. + * copy - Create a copy of a list. + * concat - Creates a new list that is a copy of both input lists. + * delete_n - Creates a new list without the chosen elements. + * reverse - Creates a backwards copy of the input list. + * sort - Use quick sort to construct a new list. + * transform - Creates a new list by transforming each of the nodes. + * + * TRANFORMS: (Note: These functions all modify the input list.) + * ---------- + * join - Concatenates list 1 and list 2. + * delete_d - Removes the requested elements from the list. + * transform_d - Modifies the list by applying a function to each node. + * insert - Add a new element into this spot in a list. (not + *NIL_LIST) push_last - Add a new element onto the end of a list. + * reverse_d - Reverse a list and destroy the old one. + * + * ASSOCIATED LISTS: + * ----------------- + * adelete - Remove a particular entry from an associated list. + * assoc - Find an entry in an associated list that matches a key. + * match - Return the data element of an a-list entry. + * + * DISPLAY: + * ----------------- + * print_cell - Print a hex dump of a list cell. + * show - Displays a string and a list (using lprint). + * + * SETS: + * ----- + * adjoin - Add a new element to list if it does not exist already. + * intersection - Create a new list that is the set intersection. + * set_union - Create a new list that is the set intersection. + * set_difference - Create a new list that is the set difference. + * s_adjoin - Add an element to a sort list if it is not there. + * s_intersection - Set intersection on a sorted list. Modifies old list. + * s_union - Set intersection on a sorted list. Modifies old list. + * search - Return the pointer to the list cell whose node matches. + * + * COMPARISONS: + * ----------------- + * is_same - Compares each node to the key. + * is_not_same - Compares each node to the key. + * is_key - Compares first of each node to the key. + * is_not_key - Compares first of each node to the key. + * + * CELL OPERATIONS: + * ----------------- + * new_cell - Obtain a new list cell from the free list. Allocate. + * free_cell - Return a list cell to the free list. + * destroy - Return all list cells in a list. + * destroy_nodes - Apply a function to each list cell and destroy the list. + * set_node - Assign the node field in a list cell. + * set_rest - Assign the next field in a list cell. + * + ***********************************************************************/ + +#ifndef LIST_H +#define LIST_H + +#include "cutil.h" +#include "tesscallback.h" + +/*---------------------------------------------------------------------- + T y p e s +----------------------------------------------------------------------*/ +#define NIL_LIST (LIST) 0 +struct list_rec +{ + struct list_rec *node; + struct list_rec *next; +}; +typedef list_rec *LIST; + +/*---------------------------------------------------------------------- + M a c r o s +----------------------------------------------------------------------*/ +/* Predefinitions */ +#define list_rest(l) ((l) ? (l)->next : NIL_LIST) +#define first_node(l) ((l) ? (l)->node : NIL_LIST) + +/********************************************************************** + * c o p y f i r s t + * + * Do the appropriate kind a push operation to copy the first node from + * one list to another. + * + **********************************************************************/ + +#define copy_first(l1,l2) \ +(l2=push(l2, first_node(l1))) + +/********************************************************************** + * i t e r a t e + * + * Visit each node in the list. Replace the old list with the list + * minus the head. Continue until the list is NIL_LIST. + **********************************************************************/ + +#define iterate(l) \ +for (; (l) != NIL_LIST; (l) = list_rest (l)) + +/********************************************************************** + * i t e r a t e l i s t + * + * Visit each node in the list (l). Use a local variable (x) to iterate + * through all of the list cells. This macro is identical to iterate + * except that it does not lose the original list. + **********************************************************************/ + +#define iterate_list(x,l) \ +for ((x)=(l); (x)!=0; (x)=list_rest(x)) + +/********************************************************************** + * j o i n o n + * + * Add another list onto the tail of this one. The list given as an input + * parameter is modified. + **********************************************************************/ + +#define JOIN_ON(list1,list2) \ +((list1) = join ((list1), (list2))) + +/********************************************************************** + * p o p o f f + * + * Add a cell onto the front of a list. The list given as an input + * parameter is modified. + **********************************************************************/ + +#define pop_off(list) \ +((list) = pop (list)) + +/********************************************************************** + * p u s h o n + * + * Add a cell onto the front of a list. The list given as an input + * parameter is modified. + **********************************************************************/ + +#define push_on(list,thing) \ +((list) = push (list, (LIST) (thing))) + +/********************************************************************** + * s e c o n d + * + * Return the contents of the second list element. + * + * #define second_node(l) first_node (list_rest (l)) + **********************************************************************/ + +#define second_node(l) \ +first_node (list_rest (l)) + +/********************************************************************** + * s e t r e s t + * + * Change the "next" field of a list element to point to a desired place. + * + * #define set_rest(l,node) l->next = node; + **********************************************************************/ + +#define set_rest(l,cell)\ +((l)->next = (cell)) + +/********************************************************************** + * t h i r d + * + * Return the contents of the third list element. + * + * #define third(l) first_node (list_rest (list_rest (l))) + **********************************************************************/ + +#define third(l) \ +first_node (list_rest (list_rest (l))) + +/*---------------------------------------------------------------------- + Public Function Prototypes +----------------------------------------------------------------------*/ +int count(LIST var_list); + +LIST delete_d(LIST list, void *key, int_compare is_equal); + +LIST delete_d(LIST list, void *key, + TessResultCallback2* is_equal); + +LIST destroy(LIST list); + +void destroy_nodes(LIST list, void_dest destructor); + +void insert(LIST list, void *node); + +int is_same(void *item1, void *item2); + +LIST join(LIST list1, LIST list2); + +LIST last(LIST var_list); + +void *nth_cell(LIST var_list, int item_num); + +LIST pop(LIST list); + +LIST push(LIST list, void *element); + +LIST push_last(LIST list, void *item); + +LIST reverse(LIST list); + +LIST reverse_d(LIST list); + +LIST s_adjoin(LIST var_list, void *variable, int_compare compare); + +LIST search(LIST list, void *key, int_compare is_equal); + +LIST search(LIST list, void *key, TessResultCallback2*); + +/* +#if defined(__STDC__) || defined(__cplusplus) +# define _ARGS(s) s +#else +# define _ARGS(s) () +#endif + +typedef void (*destructor) _ARGS((LIST l)); + +typedef LIST (*list_proc) _ARGS((LIST a)); + +int count +_ARGS((LIST var_list)); + +LIST delete_d +_ARGS((LIST list, + LIST key, + int_compare is_equal)); + +LIST destroy +_ARGS((LIST list)); + +LIST destroy_nodes +_ARGS((LIST list, + void_dest destructor)); + +void insert +_ARGS((LIST list, + LIST node)); + +int is_same_node +_ARGS((LIST s1, + LIST s2)); + +int is_same +_ARGS((LIST s1, + LIST s2)); + +LIST join +_ARGS((LIST list1, + LIST list2)); + +LIST last +_ARGS((LIST var_list)); + +LIST nth_cell +_ARGS((LIST var_list, + int item_num)); + +LIST pop +_ARGS((LIST list)); + +LIST push +_ARGS((LIST list, + LIST element)); + +LIST push_last +_ARGS((LIST list, + LIST item)); + +LIST reverse +_ARGS((LIST list)); + +LIST reverse_d +_ARGS((LIST list)); + +LIST s_adjoin +_ARGS((LIST var_list, + LIST variable, + int_compare compare)); + +LIST search +_ARGS((LIST list, + LIST key, + int_compare is_equal)); + +#undef _ARGS +*/ +#endif diff --git a/src/cutil/structures.cpp b/src/cutil/structures.cpp index dae2e08877..366d331a3a 100644 --- a/src/cutil/structures.cpp +++ b/src/cutil/structures.cpp @@ -1,36 +1,36 @@ -/* -*-C-*- - ******************************************************************************** - * - * File: structures.cpp (Formerly structures.c) - * Description: Allocate all the different types of structures. - * Author: Mark Seaman, OCR Technology - * Created: Wed May 30 10:27:26 1990 - * Modified: Mon Jul 15 10:39:18 1991 (Mark Seaman) marks@hpgrlt - * Language: C - * Package: N/A - * Status: Experimental (Do Not Distribute) - * - * (c) Copyright 1990, Hewlett-Packard Company. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - *********************************************************************************/ -/*---------------------------------------------------------------------- - I n c l u d e s -----------------------------------------------------------------------*/ -#include "structures.h" - -#include - - -/*---------------------------------------------------------------------- - F u n c t i o n s -----------------------------------------------------------------------*/ -makestructure(new_cell, free_cell, list_rec) +/* -*-C-*- + ******************************************************************************** + * + * File: structures.cpp (Formerly structures.c) + * Description: Allocate all the different types of structures. + * Author: Mark Seaman, OCR Technology + * Created: Wed May 30 10:27:26 1990 + * Modified: Mon Jul 15 10:39:18 1991 (Mark Seaman) marks@hpgrlt + * Language: C + * Package: N/A + * Status: Experimental (Do Not Distribute) + * + * (c) Copyright 1990, Hewlett-Packard Company. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + *********************************************************************************/ +/*---------------------------------------------------------------------- + I n c l u d e s +----------------------------------------------------------------------*/ +#include "structures.h" + +#include + + +/*---------------------------------------------------------------------- + F u n c t i o n s +----------------------------------------------------------------------*/ +makestructure(new_cell, free_cell, list_rec) diff --git a/src/cutil/structures.h b/src/cutil/structures.h index 62b5625eee..6b974df868 100644 --- a/src/cutil/structures.h +++ b/src/cutil/structures.h @@ -1,63 +1,63 @@ -/* -*-C-*- - ******************************************************************************** - * - * File: structures.h (Formerly structures.h) - * Description: Allocate all the different types of structures. - * Author: Mark Seaman, OCR Technology - * Created: Wed May 30 10:12:12 1990 - * Modified: Tue May 21 11:07:47 1991 (Mark Seaman) marks@hpgrlt - * Language: C - * Package: N/A - * Status: Experimental (Do Not Distribute) - * - * (c) Copyright 1990, Hewlett-Packard Company. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - *********************************************************************************/ -#ifndef STRUCTURES_H -#define STRUCTURES_H - -/*---------------------------------------------------------------------- - I n c l u d e s -----------------------------------------------------------------------*/ -#include "oldlist.h" -#include "danerror.h" - -/*---------------------------------------------------------------------- - M a c r o s -----------------------------------------------------------------------*/ -/********************************************************************** - * makestructure - * - * Allocate a chunk of memory for a particular data type. This macro - * defines an allocation, deallocation, and status printing function - * for each new data type. - **********************************************************************/ - -#define makestructure(newfunc, old, type) \ -type *newfunc() \ -{ \ - return new type; \ -} \ - \ - \ - \ -void old(type* deadelement) \ -{ \ - delete deadelement; \ -} \ - -/*---------------------------------------------------------------------- - F u n c t i o n s -----------------------------------------------------------------------*/ -extern LIST new_cell(); -extern void free_cell(LIST); -#endif +/* -*-C-*- + ******************************************************************************** + * + * File: structures.h (Formerly structures.h) + * Description: Allocate all the different types of structures. + * Author: Mark Seaman, OCR Technology + * Created: Wed May 30 10:12:12 1990 + * Modified: Tue May 21 11:07:47 1991 (Mark Seaman) marks@hpgrlt + * Language: C + * Package: N/A + * Status: Experimental (Do Not Distribute) + * + * (c) Copyright 1990, Hewlett-Packard Company. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + *********************************************************************************/ +#ifndef STRUCTURES_H +#define STRUCTURES_H + +/*---------------------------------------------------------------------- + I n c l u d e s +----------------------------------------------------------------------*/ +#include "oldlist.h" +#include "danerror.h" + +/*---------------------------------------------------------------------- + M a c r o s +----------------------------------------------------------------------*/ +/********************************************************************** + * makestructure + * + * Allocate a chunk of memory for a particular data type. This macro + * defines an allocation, deallocation, and status printing function + * for each new data type. + **********************************************************************/ + +#define makestructure(newfunc, old, type) \ +type *newfunc() \ +{ \ + return new type; \ +} \ + \ + \ + \ +void old(type* deadelement) \ +{ \ + delete deadelement; \ +} \ + +/*---------------------------------------------------------------------- + F u n c t i o n s +----------------------------------------------------------------------*/ +extern LIST new_cell(); +extern void free_cell(LIST); +#endif diff --git a/src/dict/context.cpp b/src/dict/context.cpp index c192d9e3f9..dbdcaaf72c 100644 --- a/src/dict/context.cpp +++ b/src/dict/context.cpp @@ -1,82 +1,82 @@ -/* -*-C-*- - ******************************************************************************** - * - * File: context.cpp (Formerly context.c) - * Description: Context checking functions - * Author: Mark Seaman, OCR Technology - * Created: Thu Feb 15 11:18:24 1990 - * Modified: Tue Jul 9 17:38:16 1991 (Mark Seaman) marks@hpgrlt - * Language: C - * Package: N/A - * Status: Experimental (Do Not Distribute) - * - * (c) Copyright 1990, Hewlett-Packard Company. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - *********************************************************************************/ - -#include "dict.h" -#include "tprintf.h" -#include "unicharset.h" - -namespace tesseract { - -static const int kMinAbsoluteGarbageWordLength = 10; -static const float kMinAbsoluteGarbageAlphanumFrac = 0.5f; - -const int case_state_table[6][4] = { - {/* 0. Beginning of word */ - /* P U L D */ - /* -1. Error on case */ - 0, 1, 5, 4}, - {/* 1. After initial capital */ - 0, 3, 2, 4}, - {/* 2. After lower case */ - 0, -1, 2, -1}, - {/* 3. After upper case */ - 0, 3, -1, 4}, - {/* 4. After a digit */ - 0, -1, -1, 4}, - {/* 5. After initial lower case */ - 5, -1, 2, -1}, -}; - -int Dict::case_ok(const WERD_CHOICE &word, const UNICHARSET &unicharset) const { - int state = 0; - int x; - for (x = 0; x < word.length(); ++x) { - UNICHAR_ID ch_id = word.unichar_id(x); - if (unicharset.get_isupper(ch_id)) - state = case_state_table[state][1]; - else if (unicharset.get_islower(ch_id)) - state = case_state_table[state][2]; - else if (unicharset.get_isdigit(ch_id)) - state = case_state_table[state][3]; - else - state = case_state_table[state][0]; - if (state == -1) return false; - } - return state != 5; // single lower is bad -} - -bool Dict::absolute_garbage(const WERD_CHOICE &word, - const UNICHARSET &unicharset) { - if (word.length() < kMinAbsoluteGarbageWordLength) return false; - int num_alphanum = 0; - for (int x = 0; x < word.length(); ++x) { - num_alphanum += (unicharset.get_isalpha(word.unichar_id(x)) || - unicharset.get_isdigit(word.unichar_id(x))); - } - return (static_cast(num_alphanum) / - static_cast(word.length()) < kMinAbsoluteGarbageAlphanumFrac); -} - -} // namespace tesseract +/* -*-C-*- + ******************************************************************************** + * + * File: context.cpp (Formerly context.c) + * Description: Context checking functions + * Author: Mark Seaman, OCR Technology + * Created: Thu Feb 15 11:18:24 1990 + * Modified: Tue Jul 9 17:38:16 1991 (Mark Seaman) marks@hpgrlt + * Language: C + * Package: N/A + * Status: Experimental (Do Not Distribute) + * + * (c) Copyright 1990, Hewlett-Packard Company. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + *********************************************************************************/ + +#include "dict.h" +#include "tprintf.h" +#include "unicharset.h" + +namespace tesseract { + +static const int kMinAbsoluteGarbageWordLength = 10; +static const float kMinAbsoluteGarbageAlphanumFrac = 0.5f; + +const int case_state_table[6][4] = { + {/* 0. Beginning of word */ + /* P U L D */ + /* -1. Error on case */ + 0, 1, 5, 4}, + {/* 1. After initial capital */ + 0, 3, 2, 4}, + {/* 2. After lower case */ + 0, -1, 2, -1}, + {/* 3. After upper case */ + 0, 3, -1, 4}, + {/* 4. After a digit */ + 0, -1, -1, 4}, + {/* 5. After initial lower case */ + 5, -1, 2, -1}, +}; + +int Dict::case_ok(const WERD_CHOICE &word, const UNICHARSET &unicharset) const { + int state = 0; + int x; + for (x = 0; x < word.length(); ++x) { + UNICHAR_ID ch_id = word.unichar_id(x); + if (unicharset.get_isupper(ch_id)) + state = case_state_table[state][1]; + else if (unicharset.get_islower(ch_id)) + state = case_state_table[state][2]; + else if (unicharset.get_isdigit(ch_id)) + state = case_state_table[state][3]; + else + state = case_state_table[state][0]; + if (state == -1) return false; + } + return state != 5; // single lower is bad +} + +bool Dict::absolute_garbage(const WERD_CHOICE &word, + const UNICHARSET &unicharset) { + if (word.length() < kMinAbsoluteGarbageWordLength) return false; + int num_alphanum = 0; + for (int x = 0; x < word.length(); ++x) { + num_alphanum += (unicharset.get_isalpha(word.unichar_id(x)) || + unicharset.get_isdigit(word.unichar_id(x))); + } + return (static_cast(num_alphanum) / + static_cast(word.length()) < kMinAbsoluteGarbageAlphanumFrac); +} + +} // namespace tesseract diff --git a/src/dict/dawg_cache.cpp b/src/dict/dawg_cache.cpp index f91cc76a3f..59b2118c2b 100644 --- a/src/dict/dawg_cache.cpp +++ b/src/dict/dawg_cache.cpp @@ -1,97 +1,97 @@ -/////////////////////////////////////////////////////////////////////// -// File: dawg_cache.cpp -// Description: A class that knows about loading and caching dawgs. -// Author: David Eger -// Created: Fri Jan 27 12:08:00 PST 2012 -// -// (C) Copyright 2012, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -#include "dawg_cache.h" - -#include "dawg.h" -#include "object_cache.h" -#include "strngs.h" -#include "tessdatamanager.h" - -namespace tesseract { - -struct DawgLoader { - DawgLoader(const STRING &lang, TessdataType tessdata_dawg_type, - int dawg_debug_level, TessdataManager *data_file) - : lang_(lang), - data_file_(data_file), - tessdata_dawg_type_(tessdata_dawg_type), - dawg_debug_level_(dawg_debug_level) {} - - Dawg *Load(); - - STRING lang_; - TessdataManager *data_file_; - TessdataType tessdata_dawg_type_; - int dawg_debug_level_; -}; - -Dawg *DawgCache::GetSquishedDawg(const STRING &lang, - TessdataType tessdata_dawg_type, - int debug_level, TessdataManager *data_file) { - STRING data_id = data_file->GetDataFileName(); - data_id += kTessdataFileSuffixes[tessdata_dawg_type]; - DawgLoader loader(lang, tessdata_dawg_type, debug_level, data_file); - return dawgs_.Get(data_id, NewTessCallback(&loader, &DawgLoader::Load)); -} - -Dawg *DawgLoader::Load() { - TFile fp; - if (!data_file_->GetComponent(tessdata_dawg_type_, &fp)) return nullptr; - DawgType dawg_type; - PermuterType perm_type; - switch (tessdata_dawg_type_) { - case TESSDATA_PUNC_DAWG: - case TESSDATA_LSTM_PUNC_DAWG: - dawg_type = DAWG_TYPE_PUNCTUATION; - perm_type = PUNC_PERM; - break; - case TESSDATA_SYSTEM_DAWG: - case TESSDATA_LSTM_SYSTEM_DAWG: - dawg_type = DAWG_TYPE_WORD; - perm_type = SYSTEM_DAWG_PERM; - break; - case TESSDATA_NUMBER_DAWG: - case TESSDATA_LSTM_NUMBER_DAWG: - dawg_type = DAWG_TYPE_NUMBER; - perm_type = NUMBER_PERM; - break; - case TESSDATA_BIGRAM_DAWG: - dawg_type = DAWG_TYPE_WORD; // doesn't actually matter - perm_type = COMPOUND_PERM; // doesn't actually matter - break; - case TESSDATA_UNAMBIG_DAWG: - dawg_type = DAWG_TYPE_WORD; - perm_type = SYSTEM_DAWG_PERM; - break; - case TESSDATA_FREQ_DAWG: - dawg_type = DAWG_TYPE_WORD; - perm_type = FREQ_DAWG_PERM; - break; - default: - return nullptr; - } - SquishedDawg *retval = - new SquishedDawg(dawg_type, lang_, perm_type, dawg_debug_level_); - if (retval->Load(&fp)) return retval; - delete retval; - return nullptr; -} - -} // namespace tesseract +/////////////////////////////////////////////////////////////////////// +// File: dawg_cache.cpp +// Description: A class that knows about loading and caching dawgs. +// Author: David Eger +// Created: Fri Jan 27 12:08:00 PST 2012 +// +// (C) Copyright 2012, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +#include "dawg_cache.h" + +#include "dawg.h" +#include "object_cache.h" +#include "strngs.h" +#include "tessdatamanager.h" + +namespace tesseract { + +struct DawgLoader { + DawgLoader(const STRING &lang, TessdataType tessdata_dawg_type, + int dawg_debug_level, TessdataManager *data_file) + : lang_(lang), + data_file_(data_file), + tessdata_dawg_type_(tessdata_dawg_type), + dawg_debug_level_(dawg_debug_level) {} + + Dawg *Load(); + + STRING lang_; + TessdataManager *data_file_; + TessdataType tessdata_dawg_type_; + int dawg_debug_level_; +}; + +Dawg *DawgCache::GetSquishedDawg(const STRING &lang, + TessdataType tessdata_dawg_type, + int debug_level, TessdataManager *data_file) { + STRING data_id = data_file->GetDataFileName(); + data_id += kTessdataFileSuffixes[tessdata_dawg_type]; + DawgLoader loader(lang, tessdata_dawg_type, debug_level, data_file); + return dawgs_.Get(data_id, NewTessCallback(&loader, &DawgLoader::Load)); +} + +Dawg *DawgLoader::Load() { + TFile fp; + if (!data_file_->GetComponent(tessdata_dawg_type_, &fp)) return nullptr; + DawgType dawg_type; + PermuterType perm_type; + switch (tessdata_dawg_type_) { + case TESSDATA_PUNC_DAWG: + case TESSDATA_LSTM_PUNC_DAWG: + dawg_type = DAWG_TYPE_PUNCTUATION; + perm_type = PUNC_PERM; + break; + case TESSDATA_SYSTEM_DAWG: + case TESSDATA_LSTM_SYSTEM_DAWG: + dawg_type = DAWG_TYPE_WORD; + perm_type = SYSTEM_DAWG_PERM; + break; + case TESSDATA_NUMBER_DAWG: + case TESSDATA_LSTM_NUMBER_DAWG: + dawg_type = DAWG_TYPE_NUMBER; + perm_type = NUMBER_PERM; + break; + case TESSDATA_BIGRAM_DAWG: + dawg_type = DAWG_TYPE_WORD; // doesn't actually matter + perm_type = COMPOUND_PERM; // doesn't actually matter + break; + case TESSDATA_UNAMBIG_DAWG: + dawg_type = DAWG_TYPE_WORD; + perm_type = SYSTEM_DAWG_PERM; + break; + case TESSDATA_FREQ_DAWG: + dawg_type = DAWG_TYPE_WORD; + perm_type = FREQ_DAWG_PERM; + break; + default: + return nullptr; + } + SquishedDawg *retval = + new SquishedDawg(dawg_type, lang_, perm_type, dawg_debug_level_); + if (retval->Load(&fp)) return retval; + delete retval; + return nullptr; +} + +} // namespace tesseract diff --git a/src/dict/dawg_cache.h b/src/dict/dawg_cache.h index 815c87cad3..8323380222 100644 --- a/src/dict/dawg_cache.h +++ b/src/dict/dawg_cache.h @@ -1,53 +1,53 @@ -/////////////////////////////////////////////////////////////////////// -// File: dawg_cache.h -// Description: A class that knows about loading and caching dawgs. -// Author: David Eger -// Created: Fri Jan 27 12:08:00 PST 2012 -// -// (C) Copyright 2012, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -#ifndef TESSERACT_DICT_DAWG_CACHE_H_ -#define TESSERACT_DICT_DAWG_CACHE_H_ - -#include "dawg.h" -#include "object_cache.h" -#include "strngs.h" -#include "tessdatamanager.h" - -namespace tesseract { - -class DawgCache { - public: - Dawg *GetSquishedDawg(const STRING &lang, TessdataType tessdata_dawg_type, - int debug_level, TessdataManager *data_file); - - // If we manage the given dawg, decrement its count, - // and possibly delete it if the count reaches zero. - // If dawg is unknown to us, return false. - bool FreeDawg(Dawg *dawg) { - return dawgs_.Free(dawg); - } - - // Free up any currently unused dawgs. - void DeleteUnusedDawgs() { - dawgs_.DeleteUnusedObjects(); - } - - private: - ObjectCache dawgs_; -}; - -} // namespace tesseract - -#endif // TESSERACT_DICT_DAWG_CACHE_H_ +/////////////////////////////////////////////////////////////////////// +// File: dawg_cache.h +// Description: A class that knows about loading and caching dawgs. +// Author: David Eger +// Created: Fri Jan 27 12:08:00 PST 2012 +// +// (C) Copyright 2012, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +#ifndef TESSERACT_DICT_DAWG_CACHE_H_ +#define TESSERACT_DICT_DAWG_CACHE_H_ + +#include "dawg.h" +#include "object_cache.h" +#include "strngs.h" +#include "tessdatamanager.h" + +namespace tesseract { + +class DawgCache { + public: + Dawg *GetSquishedDawg(const STRING &lang, TessdataType tessdata_dawg_type, + int debug_level, TessdataManager *data_file); + + // If we manage the given dawg, decrement its count, + // and possibly delete it if the count reaches zero. + // If dawg is unknown to us, return false. + bool FreeDawg(Dawg *dawg) { + return dawgs_.Free(dawg); + } + + // Free up any currently unused dawgs. + void DeleteUnusedDawgs() { + dawgs_.DeleteUnusedObjects(); + } + + private: + ObjectCache dawgs_; +}; + +} // namespace tesseract + +#endif // TESSERACT_DICT_DAWG_CACHE_H_ diff --git a/src/lstm/convolve.cpp b/src/lstm/convolve.cpp index c0f6919005..a94c35fdd4 100644 --- a/src/lstm/convolve.cpp +++ b/src/lstm/convolve.cpp @@ -1,119 +1,119 @@ -/////////////////////////////////////////////////////////////////////// -// File: convolve.cpp -// Description: Convolutional layer that stacks the inputs over its rectangle -// and pulls in random data to fill out-of-input inputs. -// Output is therefore same size as its input, but deeper. -// Author: Ray Smith -// Created: Tue Mar 18 16:56:06 PST 2014 -// -// (C) Copyright 2014, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -/////////////////////////////////////////////////////////////////////// - -#include "convolve.h" - -#include "networkscratch.h" -#include "serialis.h" - -namespace tesseract { - -Convolve::Convolve(const STRING& name, int ni, int half_x, int half_y) - : Network(NT_CONVOLVE, name, ni, ni * (2*half_x + 1) * (2*half_y + 1)), - half_x_(half_x), half_y_(half_y) { -} - -Convolve::~Convolve() { -} - -// Writes to the given file. Returns false in case of error. -bool Convolve::Serialize(TFile* fp) const { - if (!Network::Serialize(fp)) return false; - if (fp->FWrite(&half_x_, sizeof(half_x_), 1) != 1) return false; - if (fp->FWrite(&half_y_, sizeof(half_y_), 1) != 1) return false; - return true; -} - -// Reads from the given file. Returns false in case of error. -bool Convolve::DeSerialize(TFile* fp) { - if (fp->FReadEndian(&half_x_, sizeof(half_x_), 1) != 1) return false; - if (fp->FReadEndian(&half_y_, sizeof(half_y_), 1) != 1) return false; - no_ = ni_ * (2*half_x_ + 1) * (2*half_y_ + 1); - return true; -} - -// Runs forward propagation of activations on the input line. -// See NetworkCpp for a detailed discussion of the arguments. -void Convolve::Forward(bool debug, const NetworkIO& input, - const TransposedArray* input_transpose, - NetworkScratch* scratch, NetworkIO* output) { - output->Resize(input, no_); - int y_scale = 2 * half_y_ + 1; - StrideMap::Index dest_index(output->stride_map()); - do { - // Stack x_scale groups of y_scale * ni_ inputs together. - int t = dest_index.t(); - int out_ix = 0; - for (int x = -half_x_; x <= half_x_; ++x, out_ix += y_scale * ni_) { - StrideMap::Index x_index(dest_index); - if (!x_index.AddOffset(x, FD_WIDTH)) { - // This x is outside the image. - output->Randomize(t, out_ix, y_scale * ni_, randomizer_); - } else { - int out_iy = out_ix; - for (int y = -half_y_; y <= half_y_; ++y, out_iy += ni_) { - StrideMap::Index y_index(x_index); - if (!y_index.AddOffset(y, FD_HEIGHT)) { - // This y is outside the image. - output->Randomize(t, out_iy, ni_, randomizer_); - } else { - output->CopyTimeStepGeneral(t, out_iy, ni_, input, y_index.t(), 0); - } - } - } - } - } while (dest_index.Increment()); - if (debug) DisplayForward(*output); -} - -// Runs backward propagation of errors on the deltas line. -// See NetworkCpp for a detailed discussion of the arguments. -bool Convolve::Backward(bool debug, const NetworkIO& fwd_deltas, - NetworkScratch* scratch, - NetworkIO* back_deltas) { - back_deltas->Resize(fwd_deltas, ni_); - NetworkScratch::IO delta_sum; - delta_sum.ResizeFloat(fwd_deltas, ni_, scratch); - delta_sum->Zero(); - int y_scale = 2 * half_y_ + 1; - StrideMap::Index src_index(fwd_deltas.stride_map()); - do { - // Stack x_scale groups of y_scale * ni_ inputs together. - int t = src_index.t(); - int out_ix = 0; - for (int x = -half_x_; x <= half_x_; ++x, out_ix += y_scale * ni_) { - StrideMap::Index x_index(src_index); - if (x_index.AddOffset(x, FD_WIDTH)) { - int out_iy = out_ix; - for (int y = -half_y_; y <= half_y_; ++y, out_iy += ni_) { - StrideMap::Index y_index(x_index); - if (y_index.AddOffset(y, FD_HEIGHT)) { - fwd_deltas.AddTimeStepPart(t, out_iy, ni_, - delta_sum->f(y_index.t())); - } - } - } - } - } while (src_index.Increment()); - back_deltas->CopyAll(*delta_sum); - return true; -} - -} // namespace tesseract. +/////////////////////////////////////////////////////////////////////// +// File: convolve.cpp +// Description: Convolutional layer that stacks the inputs over its rectangle +// and pulls in random data to fill out-of-input inputs. +// Output is therefore same size as its input, but deeper. +// Author: Ray Smith +// Created: Tue Mar 18 16:56:06 PST 2014 +// +// (C) Copyright 2014, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +/////////////////////////////////////////////////////////////////////// + +#include "convolve.h" + +#include "networkscratch.h" +#include "serialis.h" + +namespace tesseract { + +Convolve::Convolve(const STRING& name, int ni, int half_x, int half_y) + : Network(NT_CONVOLVE, name, ni, ni * (2*half_x + 1) * (2*half_y + 1)), + half_x_(half_x), half_y_(half_y) { +} + +Convolve::~Convolve() { +} + +// Writes to the given file. Returns false in case of error. +bool Convolve::Serialize(TFile* fp) const { + if (!Network::Serialize(fp)) return false; + if (fp->FWrite(&half_x_, sizeof(half_x_), 1) != 1) return false; + if (fp->FWrite(&half_y_, sizeof(half_y_), 1) != 1) return false; + return true; +} + +// Reads from the given file. Returns false in case of error. +bool Convolve::DeSerialize(TFile* fp) { + if (fp->FReadEndian(&half_x_, sizeof(half_x_), 1) != 1) return false; + if (fp->FReadEndian(&half_y_, sizeof(half_y_), 1) != 1) return false; + no_ = ni_ * (2*half_x_ + 1) * (2*half_y_ + 1); + return true; +} + +// Runs forward propagation of activations on the input line. +// See NetworkCpp for a detailed discussion of the arguments. +void Convolve::Forward(bool debug, const NetworkIO& input, + const TransposedArray* input_transpose, + NetworkScratch* scratch, NetworkIO* output) { + output->Resize(input, no_); + int y_scale = 2 * half_y_ + 1; + StrideMap::Index dest_index(output->stride_map()); + do { + // Stack x_scale groups of y_scale * ni_ inputs together. + int t = dest_index.t(); + int out_ix = 0; + for (int x = -half_x_; x <= half_x_; ++x, out_ix += y_scale * ni_) { + StrideMap::Index x_index(dest_index); + if (!x_index.AddOffset(x, FD_WIDTH)) { + // This x is outside the image. + output->Randomize(t, out_ix, y_scale * ni_, randomizer_); + } else { + int out_iy = out_ix; + for (int y = -half_y_; y <= half_y_; ++y, out_iy += ni_) { + StrideMap::Index y_index(x_index); + if (!y_index.AddOffset(y, FD_HEIGHT)) { + // This y is outside the image. + output->Randomize(t, out_iy, ni_, randomizer_); + } else { + output->CopyTimeStepGeneral(t, out_iy, ni_, input, y_index.t(), 0); + } + } + } + } + } while (dest_index.Increment()); + if (debug) DisplayForward(*output); +} + +// Runs backward propagation of errors on the deltas line. +// See NetworkCpp for a detailed discussion of the arguments. +bool Convolve::Backward(bool debug, const NetworkIO& fwd_deltas, + NetworkScratch* scratch, + NetworkIO* back_deltas) { + back_deltas->Resize(fwd_deltas, ni_); + NetworkScratch::IO delta_sum; + delta_sum.ResizeFloat(fwd_deltas, ni_, scratch); + delta_sum->Zero(); + int y_scale = 2 * half_y_ + 1; + StrideMap::Index src_index(fwd_deltas.stride_map()); + do { + // Stack x_scale groups of y_scale * ni_ inputs together. + int t = src_index.t(); + int out_ix = 0; + for (int x = -half_x_; x <= half_x_; ++x, out_ix += y_scale * ni_) { + StrideMap::Index x_index(src_index); + if (x_index.AddOffset(x, FD_WIDTH)) { + int out_iy = out_ix; + for (int y = -half_y_; y <= half_y_; ++y, out_iy += ni_) { + StrideMap::Index y_index(x_index); + if (y_index.AddOffset(y, FD_HEIGHT)) { + fwd_deltas.AddTimeStepPart(t, out_iy, ni_, + delta_sum->f(y_index.t())); + } + } + } + } + } while (src_index.Increment()); + back_deltas->CopyAll(*delta_sum); + return true; +} + +} // namespace tesseract. diff --git a/src/lstm/ctc.cpp b/src/lstm/ctc.cpp index e3d0ed523b..7a84108822 100644 --- a/src/lstm/ctc.cpp +++ b/src/lstm/ctc.cpp @@ -1,412 +1,412 @@ -/////////////////////////////////////////////////////////////////////// -// File: ctc.cpp -// Description: Slightly improved standard CTC to compute the targets. -// Author: Ray Smith -// Created: Wed Jul 13 15:50:06 PDT 2016 -// -// (C) Copyright 2016, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -/////////////////////////////////////////////////////////////////////// -#include "ctc.h" - -#include - -#include "genericvector.h" -#include "host.h" -#include "matrix.h" -#include "networkio.h" - -#include "network.h" -#include "scrollview.h" - -namespace tesseract { - -// Magic constants that keep CTC stable. -// Minimum probability limit for softmax input to ctc_loss. -const float CTC::kMinProb_ = 1e-12; -// Maximum absolute argument to exp(). -const double CTC::kMaxExpArg_ = 80.0; -// Minimum probability for total prob in time normalization. -const double CTC::kMinTotalTimeProb_ = 1e-8; -// Minimum probability for total prob in final normalization. -const double CTC::kMinTotalFinalProb_ = 1e-6; - -// Builds a target using CTC. Slightly improved as follows: -// Includes normalizations and clipping for stability. -// labels should be pre-padded with nulls everywhere. -// labels can be longer than the time sequence, but the total number of -// essential labels (non-null plus nulls between equal labels) must not exceed -// the number of timesteps in outputs. -// outputs is the output of the network, and should have already been -// normalized with NormalizeProbs. -// On return targets is filled with the computed targets. -// Returns false if there is insufficient time for the labels. -/* static */ -bool CTC::ComputeCTCTargets(const GenericVector& labels, int null_char, - const GENERIC_2D_ARRAY& outputs, - NetworkIO* targets) { - std::unique_ptr ctc(new CTC(labels, null_char, outputs)); - if (!ctc->ComputeLabelLimits()) { - return false; // Not enough time. - } - // Generate simple targets purely from the truth labels by spreading them - // evenly over time. - GENERIC_2D_ARRAY simple_targets; - ctc->ComputeSimpleTargets(&simple_targets); - // Add the simple targets as a starter bias to the network outputs. - float bias_fraction = ctc->CalculateBiasFraction(); - simple_targets *= bias_fraction; - ctc->outputs_ += simple_targets; - NormalizeProbs(&ctc->outputs_); - // Run regular CTC on the biased outputs. - // Run forward and backward - GENERIC_2D_ARRAY log_alphas, log_betas; - ctc->Forward(&log_alphas); - ctc->Backward(&log_betas); - // Normalize and come out of log space with a clipped softmax over time. - log_alphas += log_betas; - ctc->NormalizeSequence(&log_alphas); - ctc->LabelsToClasses(log_alphas, targets); - NormalizeProbs(targets); - return true; -} - -CTC::CTC(const GenericVector& labels, int null_char, - const GENERIC_2D_ARRAY& outputs) - : labels_(labels), outputs_(outputs), null_char_(null_char) { - num_timesteps_ = outputs.dim1(); - num_classes_ = outputs.dim2(); - num_labels_ = labels_.size(); -} - -// Computes vectors of min and max label index for each timestep, based on -// whether skippability of nulls makes it possible to complete a valid path. -bool CTC::ComputeLabelLimits() { - min_labels_.init_to_size(num_timesteps_, 0); - max_labels_.init_to_size(num_timesteps_, 0); - int min_u = num_labels_ - 1; - if (labels_[min_u] == null_char_) --min_u; - for (int t = num_timesteps_ - 1; t >= 0; --t) { - min_labels_[t] = min_u; - if (min_u > 0) { - --min_u; - if (labels_[min_u] == null_char_ && min_u > 0 && - labels_[min_u + 1] != labels_[min_u - 1]) { - --min_u; - } - } - } - int max_u = labels_[0] == null_char_; - for (int t = 0; t < num_timesteps_; ++t) { - max_labels_[t] = max_u; - if (max_labels_[t] < min_labels_[t]) return false; // Not enough room. - if (max_u + 1 < num_labels_) { - ++max_u; - if (labels_[max_u] == null_char_ && max_u + 1 < num_labels_ && - labels_[max_u + 1] != labels_[max_u - 1]) { - ++max_u; - } - } - } - return true; -} - -// Computes targets based purely on the labels by spreading the labels evenly -// over the available timesteps. -void CTC::ComputeSimpleTargets(GENERIC_2D_ARRAY* targets) const { - // Initialize all targets to zero. - targets->Resize(num_timesteps_, num_classes_, 0.0f); - GenericVector half_widths; - GenericVector means; - ComputeWidthsAndMeans(&half_widths, &means); - for (int l = 0; l < num_labels_; ++l) { - int label = labels_[l]; - float left_half_width = half_widths[l]; - float right_half_width = left_half_width; - int mean = means[l]; - if (label == null_char_) { - if (!NeededNull(l)) { - if ((l > 0 && mean == means[l - 1]) || - (l + 1 < num_labels_ && mean == means[l + 1])) { - continue; // Drop overlapping null. - } - } - // Make sure that no space is left unoccupied and that non-nulls always - // peak at 1 by stretching nulls to meet their neighbors. - if (l > 0) left_half_width = mean - means[l - 1]; - if (l + 1 < num_labels_) right_half_width = means[l + 1] - mean; - } - if (mean >= 0 && mean < num_timesteps_) targets->put(mean, label, 1.0f); - for (int offset = 1; offset < left_half_width && mean >= offset; ++offset) { - float prob = 1.0f - offset / left_half_width; - if (mean - offset < num_timesteps_ && - prob > targets->get(mean - offset, label)) { - targets->put(mean - offset, label, prob); - } - } - for (int offset = 1; - offset < right_half_width && mean + offset < num_timesteps_; - ++offset) { - float prob = 1.0f - offset / right_half_width; - if (mean + offset >= 0 && prob > targets->get(mean + offset, label)) { - targets->put(mean + offset, label, prob); - } - } - } -} - -// Computes mean positions and half widths of the simple targets by spreading -// the labels evenly over the available timesteps. -void CTC::ComputeWidthsAndMeans(GenericVector* half_widths, - GenericVector* means) const { - // Count the number of labels of each type, in regexp terms, counts plus - // (non-null or necessary null, which must occur at least once) and star - // (optional null). - int num_plus = 0, num_star = 0; - for (int i = 0; i < num_labels_; ++i) { - if (labels_[i] != null_char_ || NeededNull(i)) - ++num_plus; - else - ++num_star; - } - // Compute the size for each type. If there is enough space for everything - // to have size>=1, then all are equal, otherwise plus_size=1 and star gets - // whatever is left-over. - float plus_size = 1.0f, star_size = 0.0f; - float total_floating = num_plus + num_star; - if (total_floating <= num_timesteps_) { - plus_size = star_size = num_timesteps_ / total_floating; - } else if (num_star > 0) { - star_size = static_cast(num_timesteps_ - num_plus) / num_star; - } - // Set the width and compute the mean of each. - float mean_pos = 0.0f; - for (int i = 0; i < num_labels_; ++i) { - float half_width; - if (labels_[i] != null_char_ || NeededNull(i)) { - half_width = plus_size / 2.0f; - } else { - half_width = star_size / 2.0f; - } - mean_pos += half_width; - means->push_back(static_cast(mean_pos)); - mean_pos += half_width; - half_widths->push_back(half_width); - } -} - -// Helper returns the index of the highest probability label at timestep t. -static int BestLabel(const GENERIC_2D_ARRAY& outputs, int t) { - int result = 0; - int num_classes = outputs.dim2(); - const float* outputs_t = outputs[t]; - for (int c = 1; c < num_classes; ++c) { - if (outputs_t[c] > outputs_t[result]) result = c; - } - return result; -} - -// Calculates and returns a suitable fraction of the simple targets to add -// to the network outputs. -float CTC::CalculateBiasFraction() { - // Compute output labels via basic decoding. - GenericVector output_labels; - for (int t = 0; t < num_timesteps_; ++t) { - int label = BestLabel(outputs_, t); - while (t + 1 < num_timesteps_ && BestLabel(outputs_, t + 1) == label) ++t; - if (label != null_char_) output_labels.push_back(label); - } - // Simple bag of labels error calculation. - GenericVector truth_counts(num_classes_, 0); - GenericVector output_counts(num_classes_, 0); - for (int l = 0; l < num_labels_; ++l) { - ++truth_counts[labels_[l]]; - } - for (int l = 0; l < output_labels.size(); ++l) { - ++output_counts[output_labels[l]]; - } - // Count the number of true and false positive non-nulls and truth labels. - int true_pos = 0, false_pos = 0, total_labels = 0; - for (int c = 0; c < num_classes_; ++c) { - if (c == null_char_) continue; - int truth_count = truth_counts[c]; - int ocr_count = output_counts[c]; - if (truth_count > 0) { - total_labels += truth_count; - if (ocr_count > truth_count) { - true_pos += truth_count; - false_pos += ocr_count - truth_count; - } else { - true_pos += ocr_count; - } - } - // We don't need to count classes that don't exist in the truth as - // false positives, because they don't affect CTC at all. - } - if (total_labels == 0) return 0.0f; - return exp(MAX(true_pos - false_pos, 1) * log(kMinProb_) / total_labels); -} - -// Given ln(x) and ln(y), returns ln(x + y), using: -// ln(x + y) = ln(y) + ln(1 + exp(ln(y) - ln(x)), ensuring that ln(x) is the -// bigger number to maximize precision. -static double LogSumExp(double ln_x, double ln_y) { - if (ln_x >= ln_y) { - return ln_x + log1p(exp(ln_y - ln_x)); - } else { - return ln_y + log1p(exp(ln_x - ln_y)); - } -} - -// Runs the forward CTC pass, filling in log_probs. -void CTC::Forward(GENERIC_2D_ARRAY* log_probs) const { - log_probs->Resize(num_timesteps_, num_labels_, -MAX_FLOAT32); - log_probs->put(0, 0, log(outputs_(0, labels_[0]))); - if (labels_[0] == null_char_) - log_probs->put(0, 1, log(outputs_(0, labels_[1]))); - for (int t = 1; t < num_timesteps_; ++t) { - const float* outputs_t = outputs_[t]; - for (int u = min_labels_[t]; u <= max_labels_[t]; ++u) { - // Continuing the same label. - double log_sum = log_probs->get(t - 1, u); - // Change from previous label. - if (u > 0) { - log_sum = LogSumExp(log_sum, log_probs->get(t - 1, u - 1)); - } - // Skip the null if allowed. - if (u >= 2 && labels_[u - 1] == null_char_ && - labels_[u] != labels_[u - 2]) { - log_sum = LogSumExp(log_sum, log_probs->get(t - 1, u - 2)); - } - // Add in the log prob of the current label. - double label_prob = outputs_t[labels_[u]]; - log_sum += log(label_prob); - log_probs->put(t, u, log_sum); - } - } -} - -// Runs the backward CTC pass, filling in log_probs. -void CTC::Backward(GENERIC_2D_ARRAY* log_probs) const { - log_probs->Resize(num_timesteps_, num_labels_, -MAX_FLOAT32); - log_probs->put(num_timesteps_ - 1, num_labels_ - 1, 0.0); - if (labels_[num_labels_ - 1] == null_char_) - log_probs->put(num_timesteps_ - 1, num_labels_ - 2, 0.0); - for (int t = num_timesteps_ - 2; t >= 0; --t) { - const float* outputs_tp1 = outputs_[t + 1]; - for (int u = min_labels_[t]; u <= max_labels_[t]; ++u) { - // Continuing the same label. - double log_sum = log_probs->get(t + 1, u) + log(outputs_tp1[labels_[u]]); - // Change from previous label. - if (u + 1 < num_labels_) { - double prev_prob = outputs_tp1[labels_[u + 1]]; - log_sum = - LogSumExp(log_sum, log_probs->get(t + 1, u + 1) + log(prev_prob)); - } - // Skip the null if allowed. - if (u + 2 < num_labels_ && labels_[u + 1] == null_char_ && - labels_[u] != labels_[u + 2]) { - double skip_prob = outputs_tp1[labels_[u + 2]]; - log_sum = - LogSumExp(log_sum, log_probs->get(t + 1, u + 2) + log(skip_prob)); - } - log_probs->put(t, u, log_sum); - } - } -} - -// Normalizes and brings probs out of log space with a softmax over time. -void CTC::NormalizeSequence(GENERIC_2D_ARRAY* probs) const { - double max_logprob = probs->Max(); - for (int u = 0; u < num_labels_; ++u) { - double total = 0.0; - for (int t = 0; t < num_timesteps_; ++t) { - // Separate impossible path from unlikely probs. - double prob = probs->get(t, u); - if (prob > -MAX_FLOAT32) - prob = ClippedExp(prob - max_logprob); - else - prob = 0.0; - total += prob; - probs->put(t, u, prob); - } - // Note that although this is a probability distribution over time and - // therefore should sum to 1, it is important to allow some labels to be - // all zero, (or at least tiny) as it is necessary to skip some blanks. - if (total < kMinTotalTimeProb_) total = kMinTotalTimeProb_; - for (int t = 0; t < num_timesteps_; ++t) - probs->put(t, u, probs->get(t, u) / total); - } -} - -// For each timestep computes the max prob for each class over all -// instances of the class in the labels_, and sets the targets to -// the max observed prob. -void CTC::LabelsToClasses(const GENERIC_2D_ARRAY& probs, - NetworkIO* targets) const { - // For each timestep compute the max prob for each class over all - // instances of the class in the labels_. - GenericVector class_probs; - for (int t = 0; t < num_timesteps_; ++t) { - float* targets_t = targets->f(t); - class_probs.init_to_size(num_classes_, 0.0); - for (int u = 0; u < num_labels_; ++u) { - double prob = probs(t, u); - // Note that although Graves specifies sum over all labels of the same - // class, we need to allow skipped blanks to go to zero, so they don't - // interfere with the non-blanks, so max is better than sum. - if (prob > class_probs[labels_[u]]) class_probs[labels_[u]] = prob; - // class_probs[labels_[u]] += prob; - } - int best_class = 0; - for (int c = 0; c < num_classes_; ++c) { - targets_t[c] = class_probs[c]; - if (class_probs[c] > class_probs[best_class]) best_class = c; - } - } -} - -// Normalizes the probabilities such that no target has a prob below min_prob, -// and, provided that the initial total is at least min_total_prob, then all -// probs will sum to 1, otherwise to sum/min_total_prob. The maximum output -// probability is thus 1 - (num_classes-1)*min_prob. -/* static */ -void CTC::NormalizeProbs(GENERIC_2D_ARRAY* probs) { - int num_timesteps = probs->dim1(); - int num_classes = probs->dim2(); - for (int t = 0; t < num_timesteps; ++t) { - float* probs_t = (*probs)[t]; - // Compute the total and clip that to prevent amplification of noise. - double total = 0.0; - for (int c = 0; c < num_classes; ++c) total += probs_t[c]; - if (total < kMinTotalFinalProb_) total = kMinTotalFinalProb_; - // Compute the increased total as a result of clipping. - double increment = 0.0; - for (int c = 0; c < num_classes; ++c) { - double prob = probs_t[c] / total; - if (prob < kMinProb_) increment += kMinProb_ - prob; - } - // Now normalize with clipping. Any additional clipping is negligible. - total += increment; - for (int c = 0; c < num_classes; ++c) { - float prob = probs_t[c] / total; - probs_t[c] = MAX(prob, kMinProb_); - } - } -} - -// Returns true if the label at index is a needed null. -bool CTC::NeededNull(int index) const { - return labels_[index] == null_char_ && index > 0 && index + 1 < num_labels_ && - labels_[index + 1] == labels_[index - 1]; -} - -} // namespace tesseract +/////////////////////////////////////////////////////////////////////// +// File: ctc.cpp +// Description: Slightly improved standard CTC to compute the targets. +// Author: Ray Smith +// Created: Wed Jul 13 15:50:06 PDT 2016 +// +// (C) Copyright 2016, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +/////////////////////////////////////////////////////////////////////// +#include "ctc.h" + +#include + +#include "genericvector.h" +#include "host.h" +#include "matrix.h" +#include "networkio.h" + +#include "network.h" +#include "scrollview.h" + +namespace tesseract { + +// Magic constants that keep CTC stable. +// Minimum probability limit for softmax input to ctc_loss. +const float CTC::kMinProb_ = 1e-12; +// Maximum absolute argument to exp(). +const double CTC::kMaxExpArg_ = 80.0; +// Minimum probability for total prob in time normalization. +const double CTC::kMinTotalTimeProb_ = 1e-8; +// Minimum probability for total prob in final normalization. +const double CTC::kMinTotalFinalProb_ = 1e-6; + +// Builds a target using CTC. Slightly improved as follows: +// Includes normalizations and clipping for stability. +// labels should be pre-padded with nulls everywhere. +// labels can be longer than the time sequence, but the total number of +// essential labels (non-null plus nulls between equal labels) must not exceed +// the number of timesteps in outputs. +// outputs is the output of the network, and should have already been +// normalized with NormalizeProbs. +// On return targets is filled with the computed targets. +// Returns false if there is insufficient time for the labels. +/* static */ +bool CTC::ComputeCTCTargets(const GenericVector& labels, int null_char, + const GENERIC_2D_ARRAY& outputs, + NetworkIO* targets) { + std::unique_ptr ctc(new CTC(labels, null_char, outputs)); + if (!ctc->ComputeLabelLimits()) { + return false; // Not enough time. + } + // Generate simple targets purely from the truth labels by spreading them + // evenly over time. + GENERIC_2D_ARRAY simple_targets; + ctc->ComputeSimpleTargets(&simple_targets); + // Add the simple targets as a starter bias to the network outputs. + float bias_fraction = ctc->CalculateBiasFraction(); + simple_targets *= bias_fraction; + ctc->outputs_ += simple_targets; + NormalizeProbs(&ctc->outputs_); + // Run regular CTC on the biased outputs. + // Run forward and backward + GENERIC_2D_ARRAY log_alphas, log_betas; + ctc->Forward(&log_alphas); + ctc->Backward(&log_betas); + // Normalize and come out of log space with a clipped softmax over time. + log_alphas += log_betas; + ctc->NormalizeSequence(&log_alphas); + ctc->LabelsToClasses(log_alphas, targets); + NormalizeProbs(targets); + return true; +} + +CTC::CTC(const GenericVector& labels, int null_char, + const GENERIC_2D_ARRAY& outputs) + : labels_(labels), outputs_(outputs), null_char_(null_char) { + num_timesteps_ = outputs.dim1(); + num_classes_ = outputs.dim2(); + num_labels_ = labels_.size(); +} + +// Computes vectors of min and max label index for each timestep, based on +// whether skippability of nulls makes it possible to complete a valid path. +bool CTC::ComputeLabelLimits() { + min_labels_.init_to_size(num_timesteps_, 0); + max_labels_.init_to_size(num_timesteps_, 0); + int min_u = num_labels_ - 1; + if (labels_[min_u] == null_char_) --min_u; + for (int t = num_timesteps_ - 1; t >= 0; --t) { + min_labels_[t] = min_u; + if (min_u > 0) { + --min_u; + if (labels_[min_u] == null_char_ && min_u > 0 && + labels_[min_u + 1] != labels_[min_u - 1]) { + --min_u; + } + } + } + int max_u = labels_[0] == null_char_; + for (int t = 0; t < num_timesteps_; ++t) { + max_labels_[t] = max_u; + if (max_labels_[t] < min_labels_[t]) return false; // Not enough room. + if (max_u + 1 < num_labels_) { + ++max_u; + if (labels_[max_u] == null_char_ && max_u + 1 < num_labels_ && + labels_[max_u + 1] != labels_[max_u - 1]) { + ++max_u; + } + } + } + return true; +} + +// Computes targets based purely on the labels by spreading the labels evenly +// over the available timesteps. +void CTC::ComputeSimpleTargets(GENERIC_2D_ARRAY* targets) const { + // Initialize all targets to zero. + targets->Resize(num_timesteps_, num_classes_, 0.0f); + GenericVector half_widths; + GenericVector means; + ComputeWidthsAndMeans(&half_widths, &means); + for (int l = 0; l < num_labels_; ++l) { + int label = labels_[l]; + float left_half_width = half_widths[l]; + float right_half_width = left_half_width; + int mean = means[l]; + if (label == null_char_) { + if (!NeededNull(l)) { + if ((l > 0 && mean == means[l - 1]) || + (l + 1 < num_labels_ && mean == means[l + 1])) { + continue; // Drop overlapping null. + } + } + // Make sure that no space is left unoccupied and that non-nulls always + // peak at 1 by stretching nulls to meet their neighbors. + if (l > 0) left_half_width = mean - means[l - 1]; + if (l + 1 < num_labels_) right_half_width = means[l + 1] - mean; + } + if (mean >= 0 && mean < num_timesteps_) targets->put(mean, label, 1.0f); + for (int offset = 1; offset < left_half_width && mean >= offset; ++offset) { + float prob = 1.0f - offset / left_half_width; + if (mean - offset < num_timesteps_ && + prob > targets->get(mean - offset, label)) { + targets->put(mean - offset, label, prob); + } + } + for (int offset = 1; + offset < right_half_width && mean + offset < num_timesteps_; + ++offset) { + float prob = 1.0f - offset / right_half_width; + if (mean + offset >= 0 && prob > targets->get(mean + offset, label)) { + targets->put(mean + offset, label, prob); + } + } + } +} + +// Computes mean positions and half widths of the simple targets by spreading +// the labels evenly over the available timesteps. +void CTC::ComputeWidthsAndMeans(GenericVector* half_widths, + GenericVector* means) const { + // Count the number of labels of each type, in regexp terms, counts plus + // (non-null or necessary null, which must occur at least once) and star + // (optional null). + int num_plus = 0, num_star = 0; + for (int i = 0; i < num_labels_; ++i) { + if (labels_[i] != null_char_ || NeededNull(i)) + ++num_plus; + else + ++num_star; + } + // Compute the size for each type. If there is enough space for everything + // to have size>=1, then all are equal, otherwise plus_size=1 and star gets + // whatever is left-over. + float plus_size = 1.0f, star_size = 0.0f; + float total_floating = num_plus + num_star; + if (total_floating <= num_timesteps_) { + plus_size = star_size = num_timesteps_ / total_floating; + } else if (num_star > 0) { + star_size = static_cast(num_timesteps_ - num_plus) / num_star; + } + // Set the width and compute the mean of each. + float mean_pos = 0.0f; + for (int i = 0; i < num_labels_; ++i) { + float half_width; + if (labels_[i] != null_char_ || NeededNull(i)) { + half_width = plus_size / 2.0f; + } else { + half_width = star_size / 2.0f; + } + mean_pos += half_width; + means->push_back(static_cast(mean_pos)); + mean_pos += half_width; + half_widths->push_back(half_width); + } +} + +// Helper returns the index of the highest probability label at timestep t. +static int BestLabel(const GENERIC_2D_ARRAY& outputs, int t) { + int result = 0; + int num_classes = outputs.dim2(); + const float* outputs_t = outputs[t]; + for (int c = 1; c < num_classes; ++c) { + if (outputs_t[c] > outputs_t[result]) result = c; + } + return result; +} + +// Calculates and returns a suitable fraction of the simple targets to add +// to the network outputs. +float CTC::CalculateBiasFraction() { + // Compute output labels via basic decoding. + GenericVector output_labels; + for (int t = 0; t < num_timesteps_; ++t) { + int label = BestLabel(outputs_, t); + while (t + 1 < num_timesteps_ && BestLabel(outputs_, t + 1) == label) ++t; + if (label != null_char_) output_labels.push_back(label); + } + // Simple bag of labels error calculation. + GenericVector truth_counts(num_classes_, 0); + GenericVector output_counts(num_classes_, 0); + for (int l = 0; l < num_labels_; ++l) { + ++truth_counts[labels_[l]]; + } + for (int l = 0; l < output_labels.size(); ++l) { + ++output_counts[output_labels[l]]; + } + // Count the number of true and false positive non-nulls and truth labels. + int true_pos = 0, false_pos = 0, total_labels = 0; + for (int c = 0; c < num_classes_; ++c) { + if (c == null_char_) continue; + int truth_count = truth_counts[c]; + int ocr_count = output_counts[c]; + if (truth_count > 0) { + total_labels += truth_count; + if (ocr_count > truth_count) { + true_pos += truth_count; + false_pos += ocr_count - truth_count; + } else { + true_pos += ocr_count; + } + } + // We don't need to count classes that don't exist in the truth as + // false positives, because they don't affect CTC at all. + } + if (total_labels == 0) return 0.0f; + return exp(MAX(true_pos - false_pos, 1) * log(kMinProb_) / total_labels); +} + +// Given ln(x) and ln(y), returns ln(x + y), using: +// ln(x + y) = ln(y) + ln(1 + exp(ln(y) - ln(x)), ensuring that ln(x) is the +// bigger number to maximize precision. +static double LogSumExp(double ln_x, double ln_y) { + if (ln_x >= ln_y) { + return ln_x + log1p(exp(ln_y - ln_x)); + } else { + return ln_y + log1p(exp(ln_x - ln_y)); + } +} + +// Runs the forward CTC pass, filling in log_probs. +void CTC::Forward(GENERIC_2D_ARRAY* log_probs) const { + log_probs->Resize(num_timesteps_, num_labels_, -MAX_FLOAT32); + log_probs->put(0, 0, log(outputs_(0, labels_[0]))); + if (labels_[0] == null_char_) + log_probs->put(0, 1, log(outputs_(0, labels_[1]))); + for (int t = 1; t < num_timesteps_; ++t) { + const float* outputs_t = outputs_[t]; + for (int u = min_labels_[t]; u <= max_labels_[t]; ++u) { + // Continuing the same label. + double log_sum = log_probs->get(t - 1, u); + // Change from previous label. + if (u > 0) { + log_sum = LogSumExp(log_sum, log_probs->get(t - 1, u - 1)); + } + // Skip the null if allowed. + if (u >= 2 && labels_[u - 1] == null_char_ && + labels_[u] != labels_[u - 2]) { + log_sum = LogSumExp(log_sum, log_probs->get(t - 1, u - 2)); + } + // Add in the log prob of the current label. + double label_prob = outputs_t[labels_[u]]; + log_sum += log(label_prob); + log_probs->put(t, u, log_sum); + } + } +} + +// Runs the backward CTC pass, filling in log_probs. +void CTC::Backward(GENERIC_2D_ARRAY* log_probs) const { + log_probs->Resize(num_timesteps_, num_labels_, -MAX_FLOAT32); + log_probs->put(num_timesteps_ - 1, num_labels_ - 1, 0.0); + if (labels_[num_labels_ - 1] == null_char_) + log_probs->put(num_timesteps_ - 1, num_labels_ - 2, 0.0); + for (int t = num_timesteps_ - 2; t >= 0; --t) { + const float* outputs_tp1 = outputs_[t + 1]; + for (int u = min_labels_[t]; u <= max_labels_[t]; ++u) { + // Continuing the same label. + double log_sum = log_probs->get(t + 1, u) + log(outputs_tp1[labels_[u]]); + // Change from previous label. + if (u + 1 < num_labels_) { + double prev_prob = outputs_tp1[labels_[u + 1]]; + log_sum = + LogSumExp(log_sum, log_probs->get(t + 1, u + 1) + log(prev_prob)); + } + // Skip the null if allowed. + if (u + 2 < num_labels_ && labels_[u + 1] == null_char_ && + labels_[u] != labels_[u + 2]) { + double skip_prob = outputs_tp1[labels_[u + 2]]; + log_sum = + LogSumExp(log_sum, log_probs->get(t + 1, u + 2) + log(skip_prob)); + } + log_probs->put(t, u, log_sum); + } + } +} + +// Normalizes and brings probs out of log space with a softmax over time. +void CTC::NormalizeSequence(GENERIC_2D_ARRAY* probs) const { + double max_logprob = probs->Max(); + for (int u = 0; u < num_labels_; ++u) { + double total = 0.0; + for (int t = 0; t < num_timesteps_; ++t) { + // Separate impossible path from unlikely probs. + double prob = probs->get(t, u); + if (prob > -MAX_FLOAT32) + prob = ClippedExp(prob - max_logprob); + else + prob = 0.0; + total += prob; + probs->put(t, u, prob); + } + // Note that although this is a probability distribution over time and + // therefore should sum to 1, it is important to allow some labels to be + // all zero, (or at least tiny) as it is necessary to skip some blanks. + if (total < kMinTotalTimeProb_) total = kMinTotalTimeProb_; + for (int t = 0; t < num_timesteps_; ++t) + probs->put(t, u, probs->get(t, u) / total); + } +} + +// For each timestep computes the max prob for each class over all +// instances of the class in the labels_, and sets the targets to +// the max observed prob. +void CTC::LabelsToClasses(const GENERIC_2D_ARRAY& probs, + NetworkIO* targets) const { + // For each timestep compute the max prob for each class over all + // instances of the class in the labels_. + GenericVector class_probs; + for (int t = 0; t < num_timesteps_; ++t) { + float* targets_t = targets->f(t); + class_probs.init_to_size(num_classes_, 0.0); + for (int u = 0; u < num_labels_; ++u) { + double prob = probs(t, u); + // Note that although Graves specifies sum over all labels of the same + // class, we need to allow skipped blanks to go to zero, so they don't + // interfere with the non-blanks, so max is better than sum. + if (prob > class_probs[labels_[u]]) class_probs[labels_[u]] = prob; + // class_probs[labels_[u]] += prob; + } + int best_class = 0; + for (int c = 0; c < num_classes_; ++c) { + targets_t[c] = class_probs[c]; + if (class_probs[c] > class_probs[best_class]) best_class = c; + } + } +} + +// Normalizes the probabilities such that no target has a prob below min_prob, +// and, provided that the initial total is at least min_total_prob, then all +// probs will sum to 1, otherwise to sum/min_total_prob. The maximum output +// probability is thus 1 - (num_classes-1)*min_prob. +/* static */ +void CTC::NormalizeProbs(GENERIC_2D_ARRAY* probs) { + int num_timesteps = probs->dim1(); + int num_classes = probs->dim2(); + for (int t = 0; t < num_timesteps; ++t) { + float* probs_t = (*probs)[t]; + // Compute the total and clip that to prevent amplification of noise. + double total = 0.0; + for (int c = 0; c < num_classes; ++c) total += probs_t[c]; + if (total < kMinTotalFinalProb_) total = kMinTotalFinalProb_; + // Compute the increased total as a result of clipping. + double increment = 0.0; + for (int c = 0; c < num_classes; ++c) { + double prob = probs_t[c] / total; + if (prob < kMinProb_) increment += kMinProb_ - prob; + } + // Now normalize with clipping. Any additional clipping is negligible. + total += increment; + for (int c = 0; c < num_classes; ++c) { + float prob = probs_t[c] / total; + probs_t[c] = MAX(prob, kMinProb_); + } + } +} + +// Returns true if the label at index is a needed null. +bool CTC::NeededNull(int index) const { + return labels_[index] == null_char_ && index > 0 && index + 1 < num_labels_ && + labels_[index + 1] == labels_[index - 1]; +} + +} // namespace tesseract diff --git a/src/lstm/ctc.h b/src/lstm/ctc.h index 1dbad9fc1b..47fba67479 100644 --- a/src/lstm/ctc.h +++ b/src/lstm/ctc.h @@ -1,130 +1,130 @@ -/////////////////////////////////////////////////////////////////////// -// File: ctc.h -// Description: Slightly improved standard CTC to compute the targets. -// Author: Ray Smith -// Created: Wed Jul 13 15:17:06 PDT 2016 -// -// (C) Copyright 2016, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -/////////////////////////////////////////////////////////////////////// - -#ifndef TESSERACT_LSTM_CTC_H_ -#define TESSERACT_LSTM_CTC_H_ - -#include "genericvector.h" -#include "network.h" -#include "networkio.h" -#include "scrollview.h" - -namespace tesseract { - -// Class to encapsulate CTC and simple target generation. -class CTC { - public: - // Normalizes the probabilities such that no target has a prob below min_prob, - // and, provided that the initial total is at least min_total_prob, then all - // probs will sum to 1, otherwise to sum/min_total_prob. The maximum output - // probability is thus 1 - (num_classes-1)*min_prob. - static void NormalizeProbs(NetworkIO* probs) { - NormalizeProbs(probs->mutable_float_array()); - } - - // Builds a target using CTC. Slightly improved as follows: - // Includes normalizations and clipping for stability. - // labels should be pre-padded with nulls wherever desired, but they don't - // have to be between all labels. Allows for multi-label codes with no - // nulls between. - // labels can be longer than the time sequence, but the total number of - // essential labels (non-null plus nulls between equal labels) must not exceed - // the number of timesteps in outputs. - // outputs is the output of the network, and should have already been - // normalized with NormalizeProbs. - // On return targets is filled with the computed targets. - // Returns false if there is insufficient time for the labels. - static bool ComputeCTCTargets(const GenericVector& truth_labels, - int null_char, - const GENERIC_2D_ARRAY& outputs, - NetworkIO* targets); - - private: - // Constructor is private as the instance only holds information specific to - // the current labels, outputs etc, and is built by the static function. - CTC(const GenericVector& labels, int null_char, - const GENERIC_2D_ARRAY& outputs); - - // Computes vectors of min and max label index for each timestep, based on - // whether skippability of nulls makes it possible to complete a valid path. - bool ComputeLabelLimits(); - // Computes targets based purely on the labels by spreading the labels evenly - // over the available timesteps. - void ComputeSimpleTargets(GENERIC_2D_ARRAY* targets) const; - // Computes mean positions and half widths of the simple targets by spreading - // the labels even over the available timesteps. - void ComputeWidthsAndMeans(GenericVector* half_widths, - GenericVector* means) const; - // Calculates and returns a suitable fraction of the simple targets to add - // to the network outputs. - float CalculateBiasFraction(); - // Runs the forward CTC pass, filling in log_probs. - void Forward(GENERIC_2D_ARRAY* log_probs) const; - // Runs the backward CTC pass, filling in log_probs. - void Backward(GENERIC_2D_ARRAY* log_probs) const; - // Normalizes and brings probs out of log space with a softmax over time. - void NormalizeSequence(GENERIC_2D_ARRAY* probs) const; - // For each timestep computes the max prob for each class over all - // instances of the class in the labels_, and sets the targets to - // the max observed prob. - void LabelsToClasses(const GENERIC_2D_ARRAY& probs, - NetworkIO* targets) const; - // Normalizes the probabilities such that no target has a prob below min_prob, - // and, provided that the initial total is at least min_total_prob, then all - // probs will sum to 1, otherwise to sum/min_total_prob. The maximum output - // probability is thus 1 - (num_classes-1)*min_prob. - static void NormalizeProbs(GENERIC_2D_ARRAY* probs); - // Returns true if the label at index is a needed null. - bool NeededNull(int index) const; - // Returns exp(clipped(x)), clipping x to a reasonable range to prevent over/ - // underflow. - static double ClippedExp(double x) { - if (x < -kMaxExpArg_) return exp(-kMaxExpArg_); - if (x > kMaxExpArg_) return exp(kMaxExpArg_); - return exp(x); - } - - // Minimum probability limit for softmax input to ctc_loss. - static const float kMinProb_; - // Maximum absolute argument to exp(). - static const double kMaxExpArg_; - // Minimum probability for total prob in time normalization. - static const double kMinTotalTimeProb_; - // Minimum probability for total prob in final normalization. - static const double kMinTotalFinalProb_; - - // The truth label indices that are to be matched to outputs_. - const GenericVector& labels_; - // The network outputs. - GENERIC_2D_ARRAY outputs_; - // The null or "blank" label. - int null_char_; - // Number of timesteps in outputs_. - int num_timesteps_; - // Number of classes in outputs_. - int num_classes_; - // Number of labels in labels_. - int num_labels_; - // Min and max valid label indices for each timestep. - GenericVector min_labels_; - GenericVector max_labels_; -}; - -} // namespace tesseract - -#endif // TESSERACT_LSTM_CTC_H_ +/////////////////////////////////////////////////////////////////////// +// File: ctc.h +// Description: Slightly improved standard CTC to compute the targets. +// Author: Ray Smith +// Created: Wed Jul 13 15:17:06 PDT 2016 +// +// (C) Copyright 2016, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +/////////////////////////////////////////////////////////////////////// + +#ifndef TESSERACT_LSTM_CTC_H_ +#define TESSERACT_LSTM_CTC_H_ + +#include "genericvector.h" +#include "network.h" +#include "networkio.h" +#include "scrollview.h" + +namespace tesseract { + +// Class to encapsulate CTC and simple target generation. +class CTC { + public: + // Normalizes the probabilities such that no target has a prob below min_prob, + // and, provided that the initial total is at least min_total_prob, then all + // probs will sum to 1, otherwise to sum/min_total_prob. The maximum output + // probability is thus 1 - (num_classes-1)*min_prob. + static void NormalizeProbs(NetworkIO* probs) { + NormalizeProbs(probs->mutable_float_array()); + } + + // Builds a target using CTC. Slightly improved as follows: + // Includes normalizations and clipping for stability. + // labels should be pre-padded with nulls wherever desired, but they don't + // have to be between all labels. Allows for multi-label codes with no + // nulls between. + // labels can be longer than the time sequence, but the total number of + // essential labels (non-null plus nulls between equal labels) must not exceed + // the number of timesteps in outputs. + // outputs is the output of the network, and should have already been + // normalized with NormalizeProbs. + // On return targets is filled with the computed targets. + // Returns false if there is insufficient time for the labels. + static bool ComputeCTCTargets(const GenericVector& truth_labels, + int null_char, + const GENERIC_2D_ARRAY& outputs, + NetworkIO* targets); + + private: + // Constructor is private as the instance only holds information specific to + // the current labels, outputs etc, and is built by the static function. + CTC(const GenericVector& labels, int null_char, + const GENERIC_2D_ARRAY& outputs); + + // Computes vectors of min and max label index for each timestep, based on + // whether skippability of nulls makes it possible to complete a valid path. + bool ComputeLabelLimits(); + // Computes targets based purely on the labels by spreading the labels evenly + // over the available timesteps. + void ComputeSimpleTargets(GENERIC_2D_ARRAY* targets) const; + // Computes mean positions and half widths of the simple targets by spreading + // the labels even over the available timesteps. + void ComputeWidthsAndMeans(GenericVector* half_widths, + GenericVector* means) const; + // Calculates and returns a suitable fraction of the simple targets to add + // to the network outputs. + float CalculateBiasFraction(); + // Runs the forward CTC pass, filling in log_probs. + void Forward(GENERIC_2D_ARRAY* log_probs) const; + // Runs the backward CTC pass, filling in log_probs. + void Backward(GENERIC_2D_ARRAY* log_probs) const; + // Normalizes and brings probs out of log space with a softmax over time. + void NormalizeSequence(GENERIC_2D_ARRAY* probs) const; + // For each timestep computes the max prob for each class over all + // instances of the class in the labels_, and sets the targets to + // the max observed prob. + void LabelsToClasses(const GENERIC_2D_ARRAY& probs, + NetworkIO* targets) const; + // Normalizes the probabilities such that no target has a prob below min_prob, + // and, provided that the initial total is at least min_total_prob, then all + // probs will sum to 1, otherwise to sum/min_total_prob. The maximum output + // probability is thus 1 - (num_classes-1)*min_prob. + static void NormalizeProbs(GENERIC_2D_ARRAY* probs); + // Returns true if the label at index is a needed null. + bool NeededNull(int index) const; + // Returns exp(clipped(x)), clipping x to a reasonable range to prevent over/ + // underflow. + static double ClippedExp(double x) { + if (x < -kMaxExpArg_) return exp(-kMaxExpArg_); + if (x > kMaxExpArg_) return exp(kMaxExpArg_); + return exp(x); + } + + // Minimum probability limit for softmax input to ctc_loss. + static const float kMinProb_; + // Maximum absolute argument to exp(). + static const double kMaxExpArg_; + // Minimum probability for total prob in time normalization. + static const double kMinTotalTimeProb_; + // Minimum probability for total prob in final normalization. + static const double kMinTotalFinalProb_; + + // The truth label indices that are to be matched to outputs_. + const GenericVector& labels_; + // The network outputs. + GENERIC_2D_ARRAY outputs_; + // The null or "blank" label. + int null_char_; + // Number of timesteps in outputs_. + int num_timesteps_; + // Number of classes in outputs_. + int num_classes_; + // Number of labels in labels_. + int num_labels_; + // Min and max valid label indices for each timestep. + GenericVector min_labels_; + GenericVector max_labels_; +}; + +} // namespace tesseract + +#endif // TESSERACT_LSTM_CTC_H_ diff --git a/src/lstm/functions.cpp b/src/lstm/functions.cpp index 94ad6f857f..644530c340 100644 --- a/src/lstm/functions.cpp +++ b/src/lstm/functions.cpp @@ -1,26 +1,26 @@ -/////////////////////////////////////////////////////////////////////// -// File: functions.cpp -// Description: Static initialize-on-first-use non-linearity functions. -// Author: Ray Smith -// Created: Tue Jul 17 14:02:59 PST 2014 -// -// (C) Copyright 2014, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -/////////////////////////////////////////////////////////////////////// - -#include "functions.h" - -namespace tesseract { - -double TanhTable[kTableSize]; -double LogisticTable[kTableSize]; - -} // namespace tesseract. +/////////////////////////////////////////////////////////////////////// +// File: functions.cpp +// Description: Static initialize-on-first-use non-linearity functions. +// Author: Ray Smith +// Created: Tue Jul 17 14:02:59 PST 2014 +// +// (C) Copyright 2014, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +/////////////////////////////////////////////////////////////////////// + +#include "functions.h" + +namespace tesseract { + +double TanhTable[kTableSize]; +double LogisticTable[kTableSize]; + +} // namespace tesseract. diff --git a/src/lstm/functions.h b/src/lstm/functions.h index c111aca497..d633e6bf7a 100644 --- a/src/lstm/functions.h +++ b/src/lstm/functions.h @@ -1,249 +1,249 @@ -/////////////////////////////////////////////////////////////////////// -// File: functions.h -// Description: Collection of function-objects used by the network layers. -// Author: Ray Smith -// Created: Fri Jun 20 10:45:37 PST 2014 -// -// (C) Copyright 2014, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -/////////////////////////////////////////////////////////////////////// - -#ifndef TESSERACT_LSTM_FUNCTIONS_H_ -#define TESSERACT_LSTM_FUNCTIONS_H_ - -#include -#include "helpers.h" -#include "tprintf.h" - -// Setting this to 1 or more causes massive dumps of debug data: weights, -// updates, internal calculations etc, and reduces the number of test iterations -// to a small number, so outputs can be diffed. -#define DEBUG_DETAIL 0 -#if DEBUG_DETAIL > 0 -#undef _OPENMP // Disable open mp to get the outputs in sync. -#endif - -namespace tesseract { - -// Size of static tables. -const int kTableSize = 4096; -// Scale factor for float arg to int index. -const double kScaleFactor = 256.0; - -extern double TanhTable[]; -extern double LogisticTable[]; - -// Non-linearity (sigmoid) functions with cache tables and clipping. -inline double Tanh(double x) { - if (x < 0.0) return -Tanh(-x); - if (x >= (kTableSize - 1) / kScaleFactor) return 1.0; - x *= kScaleFactor; - int index = static_cast(floor(x)); - if (TanhTable[index] == 0.0 && index > 0) { - // Generate the entry. - TanhTable[index] = tanh(index / kScaleFactor); - } - if (index == kTableSize - 1) return TanhTable[kTableSize - 1]; - if (TanhTable[index + 1] == 0.0) { - // Generate the entry. - TanhTable[index + 1] = tanh((index + 1) / kScaleFactor); - } - double offset = x - index; - return TanhTable[index] * (1.0 - offset) + TanhTable[index + 1] * offset; -} - -inline double Logistic(double x) { - if (x < 0.0) return 1.0 - Logistic(-x); - if (x >= (kTableSize - 1) / kScaleFactor) return 1.0; - x *= kScaleFactor; - int index = static_cast(floor(x)); - if (LogisticTable[index] == 0.0) { - // Generate the entry. - LogisticTable[index] = 1.0 / (1.0 + exp(-index / kScaleFactor)); - } - if (index == kTableSize - 1) return LogisticTable[kTableSize - 1]; - if (LogisticTable[index + 1] == 0.0) { - // Generate the entry. - LogisticTable[index + 1] = 1.0 / (1.0 + exp(-(index + 1) / kScaleFactor)); - } - double offset = x - index; - return LogisticTable[index] * (1.0 - offset) + - LogisticTable[index + 1] * offset; -} - -// Non-linearity (sigmoid) functions and their derivatives. -struct FFunc { - inline double operator()(double x) const { return Logistic(x); } -}; -struct FPrime { - inline double operator()(double y) const { return y * (1.0 - y); } -}; -struct ClipFFunc { - inline double operator()(double x) const { - if (x <= 0.0) return 0.0; - if (x >= 1.0) return 1.0; - return x; - } -}; -struct ClipFPrime { - inline double operator()(double y) const { - return 0.0 < y && y < 1.0 ? 1.0 : 0.0; - } -}; -struct Relu { - inline double operator()(double x) const { - if (x <= 0.0) return 0.0; - return x; - } -}; -struct ReluPrime { - inline double operator()(double y) const { return 0.0 < y ? 1.0 : 0.0; } -}; -struct GFunc { - inline double operator()(double x) const { return Tanh(x); } -}; -struct GPrime { - inline double operator()(double y) const { return 1.0 - y * y; } -}; -struct ClipGFunc { - inline double operator()(double x) const { - if (x <= -1.0) return -1.0; - if (x >= 1.0) return 1.0; - return x; - } -}; -struct ClipGPrime { - inline double operator()(double y) const { - return -1.0 < y && y < 1.0 ? 1.0 : 0.0; - } -}; -struct HFunc { - inline double operator()(double x) const { return Tanh(x); } -}; -struct HPrime { - inline double operator()(double y) const { - double u = Tanh(y); - return 1.0 - u * u; - } -}; -struct UnityFunc { - inline double operator()(double x) const { return 1.0; } -}; -struct IdentityFunc { - inline double operator()(double x) const { return x; } -}; - -// Applies Func in-place to inout, of size n. -template -inline void FuncInplace(int n, double* inout) { - Func f; - for (int i = 0; i < n; ++i) { - inout[i] = f(inout[i]); - } -} -// Applies Func to u and multiplies the result by v component-wise, -// putting the product in out, all of size n. -template -inline void FuncMultiply(const double* u, const double* v, int n, double* out) { - Func f; - for (int i = 0; i < n; ++i) { - out[i] = f(u[i]) * v[i]; - } -} -// Applies the Softmax function in-place to inout, of size n. -template -inline void SoftmaxInPlace(int n, T* inout) { - if (n <= 0) return; - // A limit on the negative range input to exp to guarantee non-zero output. - const T kMaxSoftmaxActivation = 86.0f; - - T max_output = inout[0]; - for (int i = 1; i < n; i++) { - T output = inout[i]; - if (output > max_output) max_output = output; - } - T prob_total = 0.0; - for (int i = 0; i < n; i++) { - T prob = inout[i] - max_output; - prob = exp(ClipToRange(prob, -kMaxSoftmaxActivation, static_cast(0))); - prob_total += prob; - inout[i] = prob; - } - if (prob_total > 0.0) { - for (int i = 0; i < n; i++) inout[i] /= prob_total; - } -} - -// Copies n values of the given src vector to dest. -inline void CopyVector(int n, const double* src, double* dest) { - memcpy(dest, src, n * sizeof(dest[0])); -} - -// Adds n values of the given src vector to dest. -inline void AccumulateVector(int n, const double* src, double* dest) { - for (int i = 0; i < n; ++i) dest[i] += src[i]; -} - -// Multiplies n values of inout in-place element-wise by the given src vector. -inline void MultiplyVectorsInPlace(int n, const double* src, double* inout) { - for (int i = 0; i < n; ++i) inout[i] *= src[i]; -} - -// Multiplies n values of u by v, element-wise, accumulating to out. -inline void MultiplyAccumulate(int n, const double* u, const double* v, - double* out) { - for (int i = 0; i < n; i++) { - out[i] += u[i] * v[i]; - } -} - -// Sums the given 5 n-vectors putting the result into sum. -inline void SumVectors(int n, const double* v1, const double* v2, - const double* v3, const double* v4, const double* v5, - double* sum) { - for (int i = 0; i < n; ++i) { - sum[i] = v1[i] + v2[i] + v3[i] + v4[i] + v5[i]; - } -} - -// Sets the given n-vector vec to 0. -template -inline void ZeroVector(int n, T* vec) { - memset(vec, 0, n * sizeof(*vec)); -} - -// Clips the given vector vec, of size n to [lower, upper]. -template -inline void ClipVector(int n, T lower, T upper, T* vec) { - for (int i = 0; i < n; ++i) vec[i] = ClipToRange(vec[i], lower, upper); -} - -// Converts the given n-vector to a binary encoding of the maximum value, -// encoded as vector of nf binary values. -inline void CodeInBinary(int n, int nf, double* vec) { - if (nf <= 0 || n < nf) return; - int index = 0; - double best_score = vec[0]; - for (int i = 1; i < n; ++i) { - if (vec[i] > best_score) { - best_score = vec[i]; - index = i; - } - } - int mask = 1; - for (int i = 0; i < nf; ++i, mask *= 2) { - vec[i] = (index & mask) ? 1.0 : 0.0; - } -} - -} // namespace tesseract. - -#endif // TESSERACT_LSTM_FUNCTIONS_H_ +/////////////////////////////////////////////////////////////////////// +// File: functions.h +// Description: Collection of function-objects used by the network layers. +// Author: Ray Smith +// Created: Fri Jun 20 10:45:37 PST 2014 +// +// (C) Copyright 2014, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +/////////////////////////////////////////////////////////////////////// + +#ifndef TESSERACT_LSTM_FUNCTIONS_H_ +#define TESSERACT_LSTM_FUNCTIONS_H_ + +#include +#include "helpers.h" +#include "tprintf.h" + +// Setting this to 1 or more causes massive dumps of debug data: weights, +// updates, internal calculations etc, and reduces the number of test iterations +// to a small number, so outputs can be diffed. +#define DEBUG_DETAIL 0 +#if DEBUG_DETAIL > 0 +#undef _OPENMP // Disable open mp to get the outputs in sync. +#endif + +namespace tesseract { + +// Size of static tables. +const int kTableSize = 4096; +// Scale factor for float arg to int index. +const double kScaleFactor = 256.0; + +extern double TanhTable[]; +extern double LogisticTable[]; + +// Non-linearity (sigmoid) functions with cache tables and clipping. +inline double Tanh(double x) { + if (x < 0.0) return -Tanh(-x); + if (x >= (kTableSize - 1) / kScaleFactor) return 1.0; + x *= kScaleFactor; + int index = static_cast(floor(x)); + if (TanhTable[index] == 0.0 && index > 0) { + // Generate the entry. + TanhTable[index] = tanh(index / kScaleFactor); + } + if (index == kTableSize - 1) return TanhTable[kTableSize - 1]; + if (TanhTable[index + 1] == 0.0) { + // Generate the entry. + TanhTable[index + 1] = tanh((index + 1) / kScaleFactor); + } + double offset = x - index; + return TanhTable[index] * (1.0 - offset) + TanhTable[index + 1] * offset; +} + +inline double Logistic(double x) { + if (x < 0.0) return 1.0 - Logistic(-x); + if (x >= (kTableSize - 1) / kScaleFactor) return 1.0; + x *= kScaleFactor; + int index = static_cast(floor(x)); + if (LogisticTable[index] == 0.0) { + // Generate the entry. + LogisticTable[index] = 1.0 / (1.0 + exp(-index / kScaleFactor)); + } + if (index == kTableSize - 1) return LogisticTable[kTableSize - 1]; + if (LogisticTable[index + 1] == 0.0) { + // Generate the entry. + LogisticTable[index + 1] = 1.0 / (1.0 + exp(-(index + 1) / kScaleFactor)); + } + double offset = x - index; + return LogisticTable[index] * (1.0 - offset) + + LogisticTable[index + 1] * offset; +} + +// Non-linearity (sigmoid) functions and their derivatives. +struct FFunc { + inline double operator()(double x) const { return Logistic(x); } +}; +struct FPrime { + inline double operator()(double y) const { return y * (1.0 - y); } +}; +struct ClipFFunc { + inline double operator()(double x) const { + if (x <= 0.0) return 0.0; + if (x >= 1.0) return 1.0; + return x; + } +}; +struct ClipFPrime { + inline double operator()(double y) const { + return 0.0 < y && y < 1.0 ? 1.0 : 0.0; + } +}; +struct Relu { + inline double operator()(double x) const { + if (x <= 0.0) return 0.0; + return x; + } +}; +struct ReluPrime { + inline double operator()(double y) const { return 0.0 < y ? 1.0 : 0.0; } +}; +struct GFunc { + inline double operator()(double x) const { return Tanh(x); } +}; +struct GPrime { + inline double operator()(double y) const { return 1.0 - y * y; } +}; +struct ClipGFunc { + inline double operator()(double x) const { + if (x <= -1.0) return -1.0; + if (x >= 1.0) return 1.0; + return x; + } +}; +struct ClipGPrime { + inline double operator()(double y) const { + return -1.0 < y && y < 1.0 ? 1.0 : 0.0; + } +}; +struct HFunc { + inline double operator()(double x) const { return Tanh(x); } +}; +struct HPrime { + inline double operator()(double y) const { + double u = Tanh(y); + return 1.0 - u * u; + } +}; +struct UnityFunc { + inline double operator()(double x) const { return 1.0; } +}; +struct IdentityFunc { + inline double operator()(double x) const { return x; } +}; + +// Applies Func in-place to inout, of size n. +template +inline void FuncInplace(int n, double* inout) { + Func f; + for (int i = 0; i < n; ++i) { + inout[i] = f(inout[i]); + } +} +// Applies Func to u and multiplies the result by v component-wise, +// putting the product in out, all of size n. +template +inline void FuncMultiply(const double* u, const double* v, int n, double* out) { + Func f; + for (int i = 0; i < n; ++i) { + out[i] = f(u[i]) * v[i]; + } +} +// Applies the Softmax function in-place to inout, of size n. +template +inline void SoftmaxInPlace(int n, T* inout) { + if (n <= 0) return; + // A limit on the negative range input to exp to guarantee non-zero output. + const T kMaxSoftmaxActivation = 86.0f; + + T max_output = inout[0]; + for (int i = 1; i < n; i++) { + T output = inout[i]; + if (output > max_output) max_output = output; + } + T prob_total = 0.0; + for (int i = 0; i < n; i++) { + T prob = inout[i] - max_output; + prob = exp(ClipToRange(prob, -kMaxSoftmaxActivation, static_cast(0))); + prob_total += prob; + inout[i] = prob; + } + if (prob_total > 0.0) { + for (int i = 0; i < n; i++) inout[i] /= prob_total; + } +} + +// Copies n values of the given src vector to dest. +inline void CopyVector(int n, const double* src, double* dest) { + memcpy(dest, src, n * sizeof(dest[0])); +} + +// Adds n values of the given src vector to dest. +inline void AccumulateVector(int n, const double* src, double* dest) { + for (int i = 0; i < n; ++i) dest[i] += src[i]; +} + +// Multiplies n values of inout in-place element-wise by the given src vector. +inline void MultiplyVectorsInPlace(int n, const double* src, double* inout) { + for (int i = 0; i < n; ++i) inout[i] *= src[i]; +} + +// Multiplies n values of u by v, element-wise, accumulating to out. +inline void MultiplyAccumulate(int n, const double* u, const double* v, + double* out) { + for (int i = 0; i < n; i++) { + out[i] += u[i] * v[i]; + } +} + +// Sums the given 5 n-vectors putting the result into sum. +inline void SumVectors(int n, const double* v1, const double* v2, + const double* v3, const double* v4, const double* v5, + double* sum) { + for (int i = 0; i < n; ++i) { + sum[i] = v1[i] + v2[i] + v3[i] + v4[i] + v5[i]; + } +} + +// Sets the given n-vector vec to 0. +template +inline void ZeroVector(int n, T* vec) { + memset(vec, 0, n * sizeof(*vec)); +} + +// Clips the given vector vec, of size n to [lower, upper]. +template +inline void ClipVector(int n, T lower, T upper, T* vec) { + for (int i = 0; i < n; ++i) vec[i] = ClipToRange(vec[i], lower, upper); +} + +// Converts the given n-vector to a binary encoding of the maximum value, +// encoded as vector of nf binary values. +inline void CodeInBinary(int n, int nf, double* vec) { + if (nf <= 0 || n < nf) return; + int index = 0; + double best_score = vec[0]; + for (int i = 1; i < n; ++i) { + if (vec[i] > best_score) { + best_score = vec[i]; + index = i; + } + } + int mask = 1; + for (int i = 0; i < nf; ++i, mask *= 2) { + vec[i] = (index & mask) ? 1.0 : 0.0; + } +} + +} // namespace tesseract. + +#endif // TESSERACT_LSTM_FUNCTIONS_H_ diff --git a/src/lstm/input.h b/src/lstm/input.h index 7b0b979b81..5bdefcb6ab 100644 --- a/src/lstm/input.h +++ b/src/lstm/input.h @@ -1,105 +1,105 @@ -/////////////////////////////////////////////////////////////////////// -// File: input.h -// Description: Input layer class for neural network implementations. -// Author: Ray Smith -// Created: Thu Mar 13 08:56:26 PDT 2014 -// -// (C) Copyright 2014, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -/////////////////////////////////////////////////////////////////////// - -#ifndef TESSERACT_LSTM_INPUT_H_ -#define TESSERACT_LSTM_INPUT_H_ - -#include "network.h" - -class ScrollView; - -namespace tesseract { - -class Input : public Network { - public: - Input(const STRING& name, int ni, int no); - Input(const STRING& name, const StaticShape& shape); - virtual ~Input(); - - virtual STRING spec() const { - STRING spec; - spec.add_str_int("", shape_.batch()); - spec.add_str_int(",", shape_.height()); - spec.add_str_int(",", shape_.width()); - spec.add_str_int(",", shape_.depth()); - return spec; - } - - // Returns the required shape input to the network. - virtual StaticShape InputShape() const { return shape_; } - // Returns the shape output from the network given an input shape (which may - // be partially unknown ie zero). - virtual StaticShape OutputShape(const StaticShape& input_shape) const { - return shape_; - } - // Writes to the given file. Returns false in case of error. - // Should be overridden by subclasses, but called by their Serialize. - virtual bool Serialize(TFile* fp) const; - // Reads from the given file. Returns false in case of error. - virtual bool DeSerialize(TFile* fp); - - // Returns an integer reduction factor that the network applies to the - // time sequence. Assumes that any 2-d is already eliminated. Used for - // scaling bounding boxes of truth data. - // WARNING: if GlobalMinimax is used to vary the scale, this will return - // the last used scale factor. Call it before any forward, and it will return - // the minimum scale factor of the paths through the GlobalMinimax. - virtual int XScaleFactor() const; - - // Provides the (minimum) x scale factor to the network (of interest only to - // input units) so they can determine how to scale bounding boxes. - virtual void CacheXScaleFactor(int factor); - - // Runs forward propagation of activations on the input line. - // See Network for a detailed discussion of the arguments. - virtual void Forward(bool debug, const NetworkIO& input, - const TransposedArray* input_transpose, - NetworkScratch* scratch, NetworkIO* output); - - // Runs backward propagation of errors on the deltas line. - // See Network for a detailed discussion of the arguments. - virtual bool Backward(bool debug, const NetworkIO& fwd_deltas, - NetworkScratch* scratch, - NetworkIO* back_deltas); - // Creates and returns a Pix of appropriate size for the network from the - // image_data. If non-null, *image_scale returns the image scale factor used. - // Returns nullptr on error. - /* static */ - static Pix* PrepareLSTMInputs(const ImageData& image_data, - const Network* network, int min_width, - TRand* randomizer, float* image_scale); - // Converts the given pix to a NetworkIO of height and depth appropriate to - // the given StaticShape: - // If depth == 3, convert to 24 bit color, otherwise normalized grey. - // Scale to target height, if the shape's height is > 1, or its depth if the - // height == 1. If height == 0 then no scaling. - // NOTE: It isn't safe for multiple threads to call this on the same pix. - static void PreparePixInput(const StaticShape& shape, const Pix* pix, - TRand* randomizer, NetworkIO* input); - - private: - // Input shape determines how images are dealt with. - StaticShape shape_; - // Cached total network x scale factor for scaling bounding boxes. - int cached_x_scale_; -}; - -} // namespace tesseract. - -#endif // TESSERACT_LSTM_INPUT_H_ - +/////////////////////////////////////////////////////////////////////// +// File: input.h +// Description: Input layer class for neural network implementations. +// Author: Ray Smith +// Created: Thu Mar 13 08:56:26 PDT 2014 +// +// (C) Copyright 2014, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +/////////////////////////////////////////////////////////////////////// + +#ifndef TESSERACT_LSTM_INPUT_H_ +#define TESSERACT_LSTM_INPUT_H_ + +#include "network.h" + +class ScrollView; + +namespace tesseract { + +class Input : public Network { + public: + Input(const STRING& name, int ni, int no); + Input(const STRING& name, const StaticShape& shape); + virtual ~Input(); + + virtual STRING spec() const { + STRING spec; + spec.add_str_int("", shape_.batch()); + spec.add_str_int(",", shape_.height()); + spec.add_str_int(",", shape_.width()); + spec.add_str_int(",", shape_.depth()); + return spec; + } + + // Returns the required shape input to the network. + virtual StaticShape InputShape() const { return shape_; } + // Returns the shape output from the network given an input shape (which may + // be partially unknown ie zero). + virtual StaticShape OutputShape(const StaticShape& input_shape) const { + return shape_; + } + // Writes to the given file. Returns false in case of error. + // Should be overridden by subclasses, but called by their Serialize. + virtual bool Serialize(TFile* fp) const; + // Reads from the given file. Returns false in case of error. + virtual bool DeSerialize(TFile* fp); + + // Returns an integer reduction factor that the network applies to the + // time sequence. Assumes that any 2-d is already eliminated. Used for + // scaling bounding boxes of truth data. + // WARNING: if GlobalMinimax is used to vary the scale, this will return + // the last used scale factor. Call it before any forward, and it will return + // the minimum scale factor of the paths through the GlobalMinimax. + virtual int XScaleFactor() const; + + // Provides the (minimum) x scale factor to the network (of interest only to + // input units) so they can determine how to scale bounding boxes. + virtual void CacheXScaleFactor(int factor); + + // Runs forward propagation of activations on the input line. + // See Network for a detailed discussion of the arguments. + virtual void Forward(bool debug, const NetworkIO& input, + const TransposedArray* input_transpose, + NetworkScratch* scratch, NetworkIO* output); + + // Runs backward propagation of errors on the deltas line. + // See Network for a detailed discussion of the arguments. + virtual bool Backward(bool debug, const NetworkIO& fwd_deltas, + NetworkScratch* scratch, + NetworkIO* back_deltas); + // Creates and returns a Pix of appropriate size for the network from the + // image_data. If non-null, *image_scale returns the image scale factor used. + // Returns nullptr on error. + /* static */ + static Pix* PrepareLSTMInputs(const ImageData& image_data, + const Network* network, int min_width, + TRand* randomizer, float* image_scale); + // Converts the given pix to a NetworkIO of height and depth appropriate to + // the given StaticShape: + // If depth == 3, convert to 24 bit color, otherwise normalized grey. + // Scale to target height, if the shape's height is > 1, or its depth if the + // height == 1. If height == 0 then no scaling. + // NOTE: It isn't safe for multiple threads to call this on the same pix. + static void PreparePixInput(const StaticShape& shape, const Pix* pix, + TRand* randomizer, NetworkIO* input); + + private: + // Input shape determines how images are dealt with. + StaticShape shape_; + // Cached total network x scale factor for scaling bounding boxes. + int cached_x_scale_; +}; + +} // namespace tesseract. + +#endif // TESSERACT_LSTM_INPUT_H_ + diff --git a/src/lstm/maxpool.cpp b/src/lstm/maxpool.cpp index e6b3ad60b6..a4e24ce809 100644 --- a/src/lstm/maxpool.cpp +++ b/src/lstm/maxpool.cpp @@ -1,86 +1,86 @@ -/////////////////////////////////////////////////////////////////////// -// File: maxpool.cpp -// Description: Standard Max-Pooling layer. -// Author: Ray Smith -// Created: Tue Mar 18 16:28:18 PST 2014 -// -// (C) Copyright 2014, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -/////////////////////////////////////////////////////////////////////// - -#include "maxpool.h" -#include "tprintf.h" - -namespace tesseract { - -Maxpool::Maxpool(const STRING& name, int ni, int x_scale, int y_scale) - : Reconfig(name, ni, x_scale, y_scale) { - type_ = NT_MAXPOOL; - no_ = ni; -} - -Maxpool::~Maxpool() { -} - -// Reads from the given file. Returns false in case of error. -bool Maxpool::DeSerialize(TFile* fp) { - bool result = Reconfig::DeSerialize(fp); - no_ = ni_; - return result; -} - -// Runs forward propagation of activations on the input line. -// See NetworkCpp for a detailed discussion of the arguments. -void Maxpool::Forward(bool debug, const NetworkIO& input, - const TransposedArray* input_transpose, - NetworkScratch* scratch, NetworkIO* output) { - output->ResizeScaled(input, x_scale_, y_scale_, no_); - maxes_.ResizeNoInit(output->Width(), ni_); - back_map_ = input.stride_map(); - - StrideMap::Index dest_index(output->stride_map()); - do { - int out_t = dest_index.t(); - StrideMap::Index src_index(input.stride_map(), dest_index.index(FD_BATCH), - dest_index.index(FD_HEIGHT) * y_scale_, - dest_index.index(FD_WIDTH) * x_scale_); - // Find the max input out of x_scale_ groups of y_scale_ inputs. - // Do it independently for each input dimension. - int* max_line = maxes_[out_t]; - int in_t = src_index.t(); - output->CopyTimeStepFrom(out_t, input, in_t); - for (int i = 0; i < ni_; ++i) { - max_line[i] = in_t; - } - for (int x = 0; x < x_scale_; ++x) { - for (int y = 0; y < y_scale_; ++y) { - StrideMap::Index src_xy(src_index); - if (src_xy.AddOffset(x, FD_WIDTH) && src_xy.AddOffset(y, FD_HEIGHT)) { - output->MaxpoolTimeStep(out_t, input, src_xy.t(), max_line); - } - } - } - } while (dest_index.Increment()); -} - -// Runs backward propagation of errors on the deltas line. -// See NetworkCpp for a detailed discussion of the arguments. -bool Maxpool::Backward(bool debug, const NetworkIO& fwd_deltas, - NetworkScratch* scratch, - NetworkIO* back_deltas) { - back_deltas->ResizeToMap(fwd_deltas.int_mode(), back_map_, ni_); - back_deltas->MaxpoolBackward(fwd_deltas, maxes_); - return true; -} - - -} // namespace tesseract. - +/////////////////////////////////////////////////////////////////////// +// File: maxpool.cpp +// Description: Standard Max-Pooling layer. +// Author: Ray Smith +// Created: Tue Mar 18 16:28:18 PST 2014 +// +// (C) Copyright 2014, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +/////////////////////////////////////////////////////////////////////// + +#include "maxpool.h" +#include "tprintf.h" + +namespace tesseract { + +Maxpool::Maxpool(const STRING& name, int ni, int x_scale, int y_scale) + : Reconfig(name, ni, x_scale, y_scale) { + type_ = NT_MAXPOOL; + no_ = ni; +} + +Maxpool::~Maxpool() { +} + +// Reads from the given file. Returns false in case of error. +bool Maxpool::DeSerialize(TFile* fp) { + bool result = Reconfig::DeSerialize(fp); + no_ = ni_; + return result; +} + +// Runs forward propagation of activations on the input line. +// See NetworkCpp for a detailed discussion of the arguments. +void Maxpool::Forward(bool debug, const NetworkIO& input, + const TransposedArray* input_transpose, + NetworkScratch* scratch, NetworkIO* output) { + output->ResizeScaled(input, x_scale_, y_scale_, no_); + maxes_.ResizeNoInit(output->Width(), ni_); + back_map_ = input.stride_map(); + + StrideMap::Index dest_index(output->stride_map()); + do { + int out_t = dest_index.t(); + StrideMap::Index src_index(input.stride_map(), dest_index.index(FD_BATCH), + dest_index.index(FD_HEIGHT) * y_scale_, + dest_index.index(FD_WIDTH) * x_scale_); + // Find the max input out of x_scale_ groups of y_scale_ inputs. + // Do it independently for each input dimension. + int* max_line = maxes_[out_t]; + int in_t = src_index.t(); + output->CopyTimeStepFrom(out_t, input, in_t); + for (int i = 0; i < ni_; ++i) { + max_line[i] = in_t; + } + for (int x = 0; x < x_scale_; ++x) { + for (int y = 0; y < y_scale_; ++y) { + StrideMap::Index src_xy(src_index); + if (src_xy.AddOffset(x, FD_WIDTH) && src_xy.AddOffset(y, FD_HEIGHT)) { + output->MaxpoolTimeStep(out_t, input, src_xy.t(), max_line); + } + } + } + } while (dest_index.Increment()); +} + +// Runs backward propagation of errors on the deltas line. +// See NetworkCpp for a detailed discussion of the arguments. +bool Maxpool::Backward(bool debug, const NetworkIO& fwd_deltas, + NetworkScratch* scratch, + NetworkIO* back_deltas) { + back_deltas->ResizeToMap(fwd_deltas.int_mode(), back_map_, ni_); + back_deltas->MaxpoolBackward(fwd_deltas, maxes_); + return true; +} + + +} // namespace tesseract. + diff --git a/src/lstm/maxpool.h b/src/lstm/maxpool.h index f3d8464d55..99e765acdd 100644 --- a/src/lstm/maxpool.h +++ b/src/lstm/maxpool.h @@ -1,70 +1,70 @@ -/////////////////////////////////////////////////////////////////////// -// File: maxpool.h -// Description: Standard Max-Pooling layer. -// Author: Ray Smith -// Created: Tue Mar 18 16:28:18 PST 2014 -// -// (C) Copyright 2014, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -/////////////////////////////////////////////////////////////////////// - -#ifndef TESSERACT_LSTM_MAXPOOL_H_ -#define TESSERACT_LSTM_MAXPOOL_H_ - -#include "reconfig.h" - -namespace tesseract { - -// Maxpooling reduction. Independently for each input, selects the location -// in the rectangle that contains the max value. -// Backprop propagates only to the position that was the max. -class Maxpool : public Reconfig { - public: - Maxpool(const STRING& name, int ni, int x_scale, int y_scale); - virtual ~Maxpool(); - - // Accessors. - virtual STRING spec() const { - STRING spec; - spec.add_str_int("Mp", y_scale_); - spec.add_str_int(",", x_scale_); - return spec; - } - - // Reads from the given file. Returns false in case of error. - virtual bool DeSerialize(TFile* fp); - - // Runs forward propagation of activations on the input line. - // See Network for a detailed discussion of the arguments. - virtual void Forward(bool debug, const NetworkIO& input, - const TransposedArray* input_transpose, - NetworkScratch* scratch, NetworkIO* output); - - // Runs backward propagation of errors on the deltas line. - // See Network for a detailed discussion of the arguments. - virtual bool Backward(bool debug, const NetworkIO& fwd_deltas, - NetworkScratch* scratch, - NetworkIO* back_deltas); - - private: - // Memory of which input was the max. - GENERIC_2D_ARRAY maxes_; -}; - - -} // namespace tesseract. - - - - - -#endif // TESSERACT_LSTM_MAXPOOL_H_ - +/////////////////////////////////////////////////////////////////////// +// File: maxpool.h +// Description: Standard Max-Pooling layer. +// Author: Ray Smith +// Created: Tue Mar 18 16:28:18 PST 2014 +// +// (C) Copyright 2014, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +/////////////////////////////////////////////////////////////////////// + +#ifndef TESSERACT_LSTM_MAXPOOL_H_ +#define TESSERACT_LSTM_MAXPOOL_H_ + +#include "reconfig.h" + +namespace tesseract { + +// Maxpooling reduction. Independently for each input, selects the location +// in the rectangle that contains the max value. +// Backprop propagates only to the position that was the max. +class Maxpool : public Reconfig { + public: + Maxpool(const STRING& name, int ni, int x_scale, int y_scale); + virtual ~Maxpool(); + + // Accessors. + virtual STRING spec() const { + STRING spec; + spec.add_str_int("Mp", y_scale_); + spec.add_str_int(",", x_scale_); + return spec; + } + + // Reads from the given file. Returns false in case of error. + virtual bool DeSerialize(TFile* fp); + + // Runs forward propagation of activations on the input line. + // See Network for a detailed discussion of the arguments. + virtual void Forward(bool debug, const NetworkIO& input, + const TransposedArray* input_transpose, + NetworkScratch* scratch, NetworkIO* output); + + // Runs backward propagation of errors on the deltas line. + // See Network for a detailed discussion of the arguments. + virtual bool Backward(bool debug, const NetworkIO& fwd_deltas, + NetworkScratch* scratch, + NetworkIO* back_deltas); + + private: + // Memory of which input was the max. + GENERIC_2D_ARRAY maxes_; +}; + + +} // namespace tesseract. + + + + + +#endif // TESSERACT_LSTM_MAXPOOL_H_ + diff --git a/src/lstm/networkbuilder.h b/src/lstm/networkbuilder.h index 1c45006c34..a405fc52b7 100644 --- a/src/lstm/networkbuilder.h +++ b/src/lstm/networkbuilder.h @@ -1,160 +1,160 @@ -/////////////////////////////////////////////////////////////////////// -// File: networkbuilder.h -// Description: Class to parse the network description language and -// build a corresponding network. -// Author: Ray Smith -// Created: Wed Jul 16 18:35:38 PST 2014 -// -// (C) Copyright 2014, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -/////////////////////////////////////////////////////////////////////// - -#ifndef TESSERACT_LSTM_NETWORKBUILDER_H_ -#define TESSERACT_LSTM_NETWORKBUILDER_H_ - -#include "static_shape.h" -#include "stridemap.h" - -class STRING; -class UNICHARSET; - -namespace tesseract { - -class Input; -class Network; -class Parallel; -class TRand; - -class NetworkBuilder { - public: - explicit NetworkBuilder(int num_softmax_outputs) - : num_softmax_outputs_(num_softmax_outputs) {} - - // Builds a network with a network_spec in the network description - // language, to recognize a character set of num_outputs size. - // If append_index is non-negative, then *network must be non-null and the - // given network_spec will be appended to *network AFTER append_index, with - // the top of the input *network discarded. - // Note that network_spec is call by value to allow a non-const char* pointer - // into the string for BuildFromString. - // net_flags control network behavior according to the NetworkFlags enum. - // The resulting network is returned via **network. - // Returns false if something failed. - static bool InitNetwork(int num_outputs, STRING network_spec, - int append_index, int net_flags, float weight_range, - TRand* randomizer, Network** network); - - // Parses the given string and returns a network according to the following - // language: - // ============ Syntax of description below: ============ - // represents a number. - // represents any single network element, including (recursively) a - // [...] series or (...) parallel construct. - // (s|t|r|l|m) (regex notation) represents a single required letter. - // NOTE THAT THROUGHOUT, x and y are REVERSED from conventional mathematics, - // to use the same convention as Tensor Flow. The reason TF adopts this - // convention is to eliminate the need to transpose images on input, since - // adjacent memory locations in images increase x and then y, while adjacent - // memory locations in tensors in TF, and NetworkIO in tesseract increase the - // rightmost index first, then the next-left and so-on, like C arrays. - // ============ INPUTS ============ - // ,,, A batch of b images with height h, width w, and depth d. - // b, h and/or w may be zero, to indicate variable size. Some network layer - // (summarizing LSTM) must be used to make a variable h known. - // d may be 1 for greyscale, 3 for color. - // NOTE that throughout the constructed network, the inputs/outputs are all of - // the same [batch,height,width,depth] dimensions, even if a different size. - // ============ PLUMBING ============ - // [...] Execute ... networks in series (layers). - // (...) Execute ... networks in parallel, with their output depths added. - // R Execute d replicas of net in parallel, with their output depths - // added. - // Rx Execute with x-dimension reversal. - // Ry Execute with y-dimension reversal. - // S, Rescale 2-D input by shrink factor x,y, rearranging the data by - // increasing the depth of the input by factor xy. - // Mp, Maxpool the input, reducing the size by an (x,y) rectangle. - // ============ FUNCTIONAL UNITS ============ - // C(s|t|r|l|m),, Convolves using a (x,y) window, with no shrinkage, - // random infill, producing d outputs, then applies a non-linearity: - // s: Sigmoid, t: Tanh, r: Relu, l: Linear, m: Softmax. - // F(s|t|r|l|m) Truly fully-connected with s|t|r|l|m non-linearity and d - // outputs. Connects to every x,y,depth position of the input, reducing - // height, width to 1, producing a single vector as the output. - // Input height and width must be constant. - // For a sliding-window linear or non-linear map that connects just to the - // input depth, and leaves the input image size as-is, use a 1x1 convolution - // eg. Cr1,1,64 instead of Fr64. - // L(f|r|b)(x|y)[s] LSTM cell with n states/outputs. - // The LSTM must have one of: - // f runs the LSTM forward only. - // r runs the LSTM reversed only. - // b runs the LSTM bidirectionally. - // It will operate on either the x- or y-dimension, treating the other - // dimension independently (as if part of the batch). - // s (optional) summarizes the output in the requested dimension, - // outputting only the final step, collapsing the dimension to a - // single element. - // LS Forward-only LSTM cell in the x-direction, with built-in Softmax. - // LE Forward-only LSTM cell in the x-direction, with built-in softmax, - // with binary Encoding. - // L2xy Full 2-d LSTM operating in quad-directions (bidi in x and y) and - // all the output depths added. - // ============ OUTPUTS ============ - // The network description must finish with an output specification: - // O(2|1|0)(l|s|c) output layer with n classes - // 2 (heatmap) Output is a 2-d vector map of the input (possibly at - // different scale). - // 1 (sequence) Output is a 1-d sequence of vector values. - // 0 (category) Output is a 0-d single vector value. - // l uses a logistic non-linearity on the output, allowing multiple - // hot elements in any output vector value. - // s uses a softmax non-linearity, with one-hot output in each value. - // c uses a softmax with CTC. Can only be used with s (sequence). - // NOTE1: Only O1s and O1c are currently supported. - // NOTE2: n is totally ignored, and for compatibility purposes only. The - // output number of classes is obtained automatically from the - // unicharset. - Network* BuildFromString(const StaticShape& input_shape, char** str); - - private: - // Parses an input specification and returns the result, which may include a - // series. - Network* ParseInput(char** str); - // Parses a sequential series of networks, defined by [...]. - Network* ParseSeries(const StaticShape& input_shape, Input* input_layer, - char** str); - // Parses a parallel set of networks, defined by (...). - Network* ParseParallel(const StaticShape& input_shape, char** str); - // Parses a network that begins with 'R'. - Network* ParseR(const StaticShape& input_shape, char** str); - // Parses a network that begins with 'S'. - Network* ParseS(const StaticShape& input_shape, char** str); - // Parses a network that begins with 'C'. - Network* ParseC(const StaticShape& input_shape, char** str); - // Parses a network that begins with 'M'. - Network* ParseM(const StaticShape& input_shape, char** str); - // Parses an LSTM network, either individual, bi- or quad-directional. - Network* ParseLSTM(const StaticShape& input_shape, char** str); - // Builds a set of 4 lstms with t and y reversal, running in true parallel. - static Network* BuildLSTMXYQuad(int num_inputs, int num_states); - // Parses a Fully connected network. - Network* ParseFullyConnected(const StaticShape& input_shape, char** str); - // Parses an Output spec. - Network* ParseOutput(const StaticShape& input_shape, char** str); - - private: - int num_softmax_outputs_; -}; - -} // namespace tesseract. - -#endif // TESSERACT_LSTM_NETWORKBUILDER_H_ +/////////////////////////////////////////////////////////////////////// +// File: networkbuilder.h +// Description: Class to parse the network description language and +// build a corresponding network. +// Author: Ray Smith +// Created: Wed Jul 16 18:35:38 PST 2014 +// +// (C) Copyright 2014, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +/////////////////////////////////////////////////////////////////////// + +#ifndef TESSERACT_LSTM_NETWORKBUILDER_H_ +#define TESSERACT_LSTM_NETWORKBUILDER_H_ + +#include "static_shape.h" +#include "stridemap.h" + +class STRING; +class UNICHARSET; + +namespace tesseract { + +class Input; +class Network; +class Parallel; +class TRand; + +class NetworkBuilder { + public: + explicit NetworkBuilder(int num_softmax_outputs) + : num_softmax_outputs_(num_softmax_outputs) {} + + // Builds a network with a network_spec in the network description + // language, to recognize a character set of num_outputs size. + // If append_index is non-negative, then *network must be non-null and the + // given network_spec will be appended to *network AFTER append_index, with + // the top of the input *network discarded. + // Note that network_spec is call by value to allow a non-const char* pointer + // into the string for BuildFromString. + // net_flags control network behavior according to the NetworkFlags enum. + // The resulting network is returned via **network. + // Returns false if something failed. + static bool InitNetwork(int num_outputs, STRING network_spec, + int append_index, int net_flags, float weight_range, + TRand* randomizer, Network** network); + + // Parses the given string and returns a network according to the following + // language: + // ============ Syntax of description below: ============ + // represents a number. + // represents any single network element, including (recursively) a + // [...] series or (...) parallel construct. + // (s|t|r|l|m) (regex notation) represents a single required letter. + // NOTE THAT THROUGHOUT, x and y are REVERSED from conventional mathematics, + // to use the same convention as Tensor Flow. The reason TF adopts this + // convention is to eliminate the need to transpose images on input, since + // adjacent memory locations in images increase x and then y, while adjacent + // memory locations in tensors in TF, and NetworkIO in tesseract increase the + // rightmost index first, then the next-left and so-on, like C arrays. + // ============ INPUTS ============ + // ,,, A batch of b images with height h, width w, and depth d. + // b, h and/or w may be zero, to indicate variable size. Some network layer + // (summarizing LSTM) must be used to make a variable h known. + // d may be 1 for greyscale, 3 for color. + // NOTE that throughout the constructed network, the inputs/outputs are all of + // the same [batch,height,width,depth] dimensions, even if a different size. + // ============ PLUMBING ============ + // [...] Execute ... networks in series (layers). + // (...) Execute ... networks in parallel, with their output depths added. + // R Execute d replicas of net in parallel, with their output depths + // added. + // Rx Execute with x-dimension reversal. + // Ry Execute with y-dimension reversal. + // S, Rescale 2-D input by shrink factor x,y, rearranging the data by + // increasing the depth of the input by factor xy. + // Mp, Maxpool the input, reducing the size by an (x,y) rectangle. + // ============ FUNCTIONAL UNITS ============ + // C(s|t|r|l|m),, Convolves using a (x,y) window, with no shrinkage, + // random infill, producing d outputs, then applies a non-linearity: + // s: Sigmoid, t: Tanh, r: Relu, l: Linear, m: Softmax. + // F(s|t|r|l|m) Truly fully-connected with s|t|r|l|m non-linearity and d + // outputs. Connects to every x,y,depth position of the input, reducing + // height, width to 1, producing a single vector as the output. + // Input height and width must be constant. + // For a sliding-window linear or non-linear map that connects just to the + // input depth, and leaves the input image size as-is, use a 1x1 convolution + // eg. Cr1,1,64 instead of Fr64. + // L(f|r|b)(x|y)[s] LSTM cell with n states/outputs. + // The LSTM must have one of: + // f runs the LSTM forward only. + // r runs the LSTM reversed only. + // b runs the LSTM bidirectionally. + // It will operate on either the x- or y-dimension, treating the other + // dimension independently (as if part of the batch). + // s (optional) summarizes the output in the requested dimension, + // outputting only the final step, collapsing the dimension to a + // single element. + // LS Forward-only LSTM cell in the x-direction, with built-in Softmax. + // LE Forward-only LSTM cell in the x-direction, with built-in softmax, + // with binary Encoding. + // L2xy Full 2-d LSTM operating in quad-directions (bidi in x and y) and + // all the output depths added. + // ============ OUTPUTS ============ + // The network description must finish with an output specification: + // O(2|1|0)(l|s|c) output layer with n classes + // 2 (heatmap) Output is a 2-d vector map of the input (possibly at + // different scale). + // 1 (sequence) Output is a 1-d sequence of vector values. + // 0 (category) Output is a 0-d single vector value. + // l uses a logistic non-linearity on the output, allowing multiple + // hot elements in any output vector value. + // s uses a softmax non-linearity, with one-hot output in each value. + // c uses a softmax with CTC. Can only be used with s (sequence). + // NOTE1: Only O1s and O1c are currently supported. + // NOTE2: n is totally ignored, and for compatibility purposes only. The + // output number of classes is obtained automatically from the + // unicharset. + Network* BuildFromString(const StaticShape& input_shape, char** str); + + private: + // Parses an input specification and returns the result, which may include a + // series. + Network* ParseInput(char** str); + // Parses a sequential series of networks, defined by [...]. + Network* ParseSeries(const StaticShape& input_shape, Input* input_layer, + char** str); + // Parses a parallel set of networks, defined by (...). + Network* ParseParallel(const StaticShape& input_shape, char** str); + // Parses a network that begins with 'R'. + Network* ParseR(const StaticShape& input_shape, char** str); + // Parses a network that begins with 'S'. + Network* ParseS(const StaticShape& input_shape, char** str); + // Parses a network that begins with 'C'. + Network* ParseC(const StaticShape& input_shape, char** str); + // Parses a network that begins with 'M'. + Network* ParseM(const StaticShape& input_shape, char** str); + // Parses an LSTM network, either individual, bi- or quad-directional. + Network* ParseLSTM(const StaticShape& input_shape, char** str); + // Builds a set of 4 lstms with t and y reversal, running in true parallel. + static Network* BuildLSTMXYQuad(int num_inputs, int num_states); + // Parses a Fully connected network. + Network* ParseFullyConnected(const StaticShape& input_shape, char** str); + // Parses an Output spec. + Network* ParseOutput(const StaticShape& input_shape, char** str); + + private: + int num_softmax_outputs_; +}; + +} // namespace tesseract. + +#endif // TESSERACT_LSTM_NETWORKBUILDER_H_ diff --git a/src/lstm/parallel.h b/src/lstm/parallel.h index 0e900de115..ad290a7ec1 100644 --- a/src/lstm/parallel.h +++ b/src/lstm/parallel.h @@ -1,87 +1,87 @@ -/////////////////////////////////////////////////////////////////////// -// File: parallel.h -// Description: Runs networks in parallel on the same input. -// Author: Ray Smith -// Created: Thu May 02 08:02:06 PST 2013 -// -// (C) Copyright 2013, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -/////////////////////////////////////////////////////////////////////// - -#ifndef TESSERACT_LSTM_PARALLEL_H_ -#define TESSERACT_LSTM_PARALLEL_H_ - -#include "plumbing.h" - -namespace tesseract { - -// Runs multiple networks in parallel, interlacing their outputs. -class Parallel : public Plumbing { - public: - // ni_ and no_ will be set by AddToStack. - Parallel(const STRING& name, NetworkType type); - virtual ~Parallel(); - - // Returns the shape output from the network given an input shape (which may - // be partially unknown ie zero). - virtual StaticShape OutputShape(const StaticShape& input_shape) const; - - virtual STRING spec() const { - STRING spec; - if (type_ == NT_PAR_2D_LSTM) { - // We have 4 LSTMs operating in parallel here, so the size of each is - // the number of outputs/4. - spec.add_str_int("L2xy", no_ / 4); - } else if (type_ == NT_PAR_RL_LSTM) { - // We have 2 LSTMs operating in parallel here, so the size of each is - // the number of outputs/2. - if (stack_[0]->type() == NT_LSTM_SUMMARY) - spec.add_str_int("Lbxs", no_ / 2); - else - spec.add_str_int("Lbx", no_ / 2); - } else { - if (type_ == NT_REPLICATED) { - spec.add_str_int("R", stack_.size()); - spec += "("; - spec += stack_[0]->spec(); - } else { - spec = "("; - for (int i = 0; i < stack_.size(); ++i) spec += stack_[i]->spec(); - } - spec += ")"; - } - return spec; - } - - // Runs forward propagation of activations on the input line. - // See Network for a detailed discussion of the arguments. - virtual void Forward(bool debug, const NetworkIO& input, - const TransposedArray* input_transpose, - NetworkScratch* scratch, NetworkIO* output); - - // Runs backward propagation of errors on the deltas line. - // See Network for a detailed discussion of the arguments. - virtual bool Backward(bool debug, const NetworkIO& fwd_deltas, - NetworkScratch* scratch, - NetworkIO* back_deltas); - - private: - // If *this is a NT_REPLICATED, then it feeds a replicated network with - // identical inputs, and it would be extremely wasteful for them to each - // calculate and store the same transpose of the inputs, so Parallel does it - // and passes a pointer to the replicated network, allowing it to use the - // transpose on the next call to Backward. - TransposedArray transposed_input_; -}; - -} // namespace tesseract. - -#endif // TESSERACT_LSTM_PARALLEL_H_ +/////////////////////////////////////////////////////////////////////// +// File: parallel.h +// Description: Runs networks in parallel on the same input. +// Author: Ray Smith +// Created: Thu May 02 08:02:06 PST 2013 +// +// (C) Copyright 2013, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +/////////////////////////////////////////////////////////////////////// + +#ifndef TESSERACT_LSTM_PARALLEL_H_ +#define TESSERACT_LSTM_PARALLEL_H_ + +#include "plumbing.h" + +namespace tesseract { + +// Runs multiple networks in parallel, interlacing their outputs. +class Parallel : public Plumbing { + public: + // ni_ and no_ will be set by AddToStack. + Parallel(const STRING& name, NetworkType type); + virtual ~Parallel(); + + // Returns the shape output from the network given an input shape (which may + // be partially unknown ie zero). + virtual StaticShape OutputShape(const StaticShape& input_shape) const; + + virtual STRING spec() const { + STRING spec; + if (type_ == NT_PAR_2D_LSTM) { + // We have 4 LSTMs operating in parallel here, so the size of each is + // the number of outputs/4. + spec.add_str_int("L2xy", no_ / 4); + } else if (type_ == NT_PAR_RL_LSTM) { + // We have 2 LSTMs operating in parallel here, so the size of each is + // the number of outputs/2. + if (stack_[0]->type() == NT_LSTM_SUMMARY) + spec.add_str_int("Lbxs", no_ / 2); + else + spec.add_str_int("Lbx", no_ / 2); + } else { + if (type_ == NT_REPLICATED) { + spec.add_str_int("R", stack_.size()); + spec += "("; + spec += stack_[0]->spec(); + } else { + spec = "("; + for (int i = 0; i < stack_.size(); ++i) spec += stack_[i]->spec(); + } + spec += ")"; + } + return spec; + } + + // Runs forward propagation of activations on the input line. + // See Network for a detailed discussion of the arguments. + virtual void Forward(bool debug, const NetworkIO& input, + const TransposedArray* input_transpose, + NetworkScratch* scratch, NetworkIO* output); + + // Runs backward propagation of errors on the deltas line. + // See Network for a detailed discussion of the arguments. + virtual bool Backward(bool debug, const NetworkIO& fwd_deltas, + NetworkScratch* scratch, + NetworkIO* back_deltas); + + private: + // If *this is a NT_REPLICATED, then it feeds a replicated network with + // identical inputs, and it would be extremely wasteful for them to each + // calculate and store the same transpose of the inputs, so Parallel does it + // and passes a pointer to the replicated network, allowing it to use the + // transpose on the next call to Backward. + TransposedArray transposed_input_; +}; + +} // namespace tesseract. + +#endif // TESSERACT_LSTM_PARALLEL_H_ diff --git a/src/lstm/reconfig.cpp b/src/lstm/reconfig.cpp index 07ab7a7fcd..9c29d45165 100644 --- a/src/lstm/reconfig.cpp +++ b/src/lstm/reconfig.cpp @@ -1,123 +1,123 @@ -/////////////////////////////////////////////////////////////////////// -// File: reconfig.cpp -// Description: Network layer that reconfigures the scaling vs feature -// depth. -// Author: Ray Smith -// Created: Wed Feb 26 15:42:25 PST 2014 -// -// (C) Copyright 2014, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -/////////////////////////////////////////////////////////////////////// -#include "reconfig.h" -#include "tprintf.h" - -namespace tesseract { - -Reconfig::Reconfig(const STRING& name, int ni, int x_scale, int y_scale) - : Network(NT_RECONFIG, name, ni, ni * x_scale * y_scale), - x_scale_(x_scale), y_scale_(y_scale) { -} - -Reconfig::~Reconfig() { -} - -// Returns the shape output from the network given an input shape (which may -// be partially unknown ie zero). -StaticShape Reconfig::OutputShape(const StaticShape& input_shape) const { - StaticShape result = input_shape; - result.set_height(result.height() / y_scale_); - result.set_width(result.width() / x_scale_); - if (type_ != NT_MAXPOOL) - result.set_depth(result.depth() * y_scale_ * x_scale_); - return result; -} - -// Returns an integer reduction factor that the network applies to the -// time sequence. Assumes that any 2-d is already eliminated. Used for -// scaling bounding boxes of truth data. -// WARNING: if GlobalMinimax is used to vary the scale, this will return -// the last used scale factor. Call it before any forward, and it will return -// the minimum scale factor of the paths through the GlobalMinimax. -int Reconfig::XScaleFactor() const { - return x_scale_; -} - -// Writes to the given file. Returns false in case of error. -bool Reconfig::Serialize(TFile* fp) const { - if (!Network::Serialize(fp)) return false; - if (fp->FWrite(&x_scale_, sizeof(x_scale_), 1) != 1) return false; - if (fp->FWrite(&y_scale_, sizeof(y_scale_), 1) != 1) return false; - return true; -} - -// Reads from the given file. Returns false in case of error. -bool Reconfig::DeSerialize(TFile* fp) { - if (fp->FReadEndian(&x_scale_, sizeof(x_scale_), 1) != 1) return false; - if (fp->FReadEndian(&y_scale_, sizeof(y_scale_), 1) != 1) return false; - no_ = ni_ * x_scale_ * y_scale_; - return true; -} - -// Runs forward propagation of activations on the input line. -// See NetworkCpp for a detailed discussion of the arguments. -void Reconfig::Forward(bool debug, const NetworkIO& input, - const TransposedArray* input_transpose, - NetworkScratch* scratch, NetworkIO* output) { - output->ResizeScaled(input, x_scale_, y_scale_, no_); - back_map_ = input.stride_map(); - StrideMap::Index dest_index(output->stride_map()); - do { - int out_t = dest_index.t(); - StrideMap::Index src_index(input.stride_map(), dest_index.index(FD_BATCH), - dest_index.index(FD_HEIGHT) * y_scale_, - dest_index.index(FD_WIDTH) * x_scale_); - // Stack x_scale_ groups of y_scale_ inputs together. - for (int x = 0; x < x_scale_; ++x) { - for (int y = 0; y < y_scale_; ++y) { - StrideMap::Index src_xy(src_index); - if (src_xy.AddOffset(x, FD_WIDTH) && src_xy.AddOffset(y, FD_HEIGHT)) { - output->CopyTimeStepGeneral(out_t, (x * y_scale_ + y) * ni_, ni_, - input, src_xy.t(), 0); - } - } - } - } while (dest_index.Increment()); -} - -// Runs backward propagation of errors on the deltas line. -// See NetworkCpp for a detailed discussion of the arguments. -bool Reconfig::Backward(bool debug, const NetworkIO& fwd_deltas, - NetworkScratch* scratch, - NetworkIO* back_deltas) { - back_deltas->ResizeToMap(fwd_deltas.int_mode(), back_map_, ni_); - StrideMap::Index src_index(fwd_deltas.stride_map()); - do { - int in_t = src_index.t(); - StrideMap::Index dest_index(back_deltas->stride_map(), - src_index.index(FD_BATCH), - src_index.index(FD_HEIGHT) * y_scale_, - src_index.index(FD_WIDTH) * x_scale_); - // Unstack x_scale_ groups of y_scale_ inputs that are together. - for (int x = 0; x < x_scale_; ++x) { - for (int y = 0; y < y_scale_; ++y) { - StrideMap::Index dest_xy(dest_index); - if (dest_xy.AddOffset(x, FD_WIDTH) && dest_xy.AddOffset(y, FD_HEIGHT)) { - back_deltas->CopyTimeStepGeneral(dest_xy.t(), 0, ni_, fwd_deltas, - in_t, (x * y_scale_ + y) * ni_); - } - } - } - } while (src_index.Increment()); - return needs_to_backprop_; -} - - -} // namespace tesseract. +/////////////////////////////////////////////////////////////////////// +// File: reconfig.cpp +// Description: Network layer that reconfigures the scaling vs feature +// depth. +// Author: Ray Smith +// Created: Wed Feb 26 15:42:25 PST 2014 +// +// (C) Copyright 2014, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +/////////////////////////////////////////////////////////////////////// +#include "reconfig.h" +#include "tprintf.h" + +namespace tesseract { + +Reconfig::Reconfig(const STRING& name, int ni, int x_scale, int y_scale) + : Network(NT_RECONFIG, name, ni, ni * x_scale * y_scale), + x_scale_(x_scale), y_scale_(y_scale) { +} + +Reconfig::~Reconfig() { +} + +// Returns the shape output from the network given an input shape (which may +// be partially unknown ie zero). +StaticShape Reconfig::OutputShape(const StaticShape& input_shape) const { + StaticShape result = input_shape; + result.set_height(result.height() / y_scale_); + result.set_width(result.width() / x_scale_); + if (type_ != NT_MAXPOOL) + result.set_depth(result.depth() * y_scale_ * x_scale_); + return result; +} + +// Returns an integer reduction factor that the network applies to the +// time sequence. Assumes that any 2-d is already eliminated. Used for +// scaling bounding boxes of truth data. +// WARNING: if GlobalMinimax is used to vary the scale, this will return +// the last used scale factor. Call it before any forward, and it will return +// the minimum scale factor of the paths through the GlobalMinimax. +int Reconfig::XScaleFactor() const { + return x_scale_; +} + +// Writes to the given file. Returns false in case of error. +bool Reconfig::Serialize(TFile* fp) const { + if (!Network::Serialize(fp)) return false; + if (fp->FWrite(&x_scale_, sizeof(x_scale_), 1) != 1) return false; + if (fp->FWrite(&y_scale_, sizeof(y_scale_), 1) != 1) return false; + return true; +} + +// Reads from the given file. Returns false in case of error. +bool Reconfig::DeSerialize(TFile* fp) { + if (fp->FReadEndian(&x_scale_, sizeof(x_scale_), 1) != 1) return false; + if (fp->FReadEndian(&y_scale_, sizeof(y_scale_), 1) != 1) return false; + no_ = ni_ * x_scale_ * y_scale_; + return true; +} + +// Runs forward propagation of activations on the input line. +// See NetworkCpp for a detailed discussion of the arguments. +void Reconfig::Forward(bool debug, const NetworkIO& input, + const TransposedArray* input_transpose, + NetworkScratch* scratch, NetworkIO* output) { + output->ResizeScaled(input, x_scale_, y_scale_, no_); + back_map_ = input.stride_map(); + StrideMap::Index dest_index(output->stride_map()); + do { + int out_t = dest_index.t(); + StrideMap::Index src_index(input.stride_map(), dest_index.index(FD_BATCH), + dest_index.index(FD_HEIGHT) * y_scale_, + dest_index.index(FD_WIDTH) * x_scale_); + // Stack x_scale_ groups of y_scale_ inputs together. + for (int x = 0; x < x_scale_; ++x) { + for (int y = 0; y < y_scale_; ++y) { + StrideMap::Index src_xy(src_index); + if (src_xy.AddOffset(x, FD_WIDTH) && src_xy.AddOffset(y, FD_HEIGHT)) { + output->CopyTimeStepGeneral(out_t, (x * y_scale_ + y) * ni_, ni_, + input, src_xy.t(), 0); + } + } + } + } while (dest_index.Increment()); +} + +// Runs backward propagation of errors on the deltas line. +// See NetworkCpp for a detailed discussion of the arguments. +bool Reconfig::Backward(bool debug, const NetworkIO& fwd_deltas, + NetworkScratch* scratch, + NetworkIO* back_deltas) { + back_deltas->ResizeToMap(fwd_deltas.int_mode(), back_map_, ni_); + StrideMap::Index src_index(fwd_deltas.stride_map()); + do { + int in_t = src_index.t(); + StrideMap::Index dest_index(back_deltas->stride_map(), + src_index.index(FD_BATCH), + src_index.index(FD_HEIGHT) * y_scale_, + src_index.index(FD_WIDTH) * x_scale_); + // Unstack x_scale_ groups of y_scale_ inputs that are together. + for (int x = 0; x < x_scale_; ++x) { + for (int y = 0; y < y_scale_; ++y) { + StrideMap::Index dest_xy(dest_index); + if (dest_xy.AddOffset(x, FD_WIDTH) && dest_xy.AddOffset(y, FD_HEIGHT)) { + back_deltas->CopyTimeStepGeneral(dest_xy.t(), 0, ni_, fwd_deltas, + in_t, (x * y_scale_ + y) * ni_); + } + } + } + } while (src_index.Increment()); + return needs_to_backprop_; +} + + +} // namespace tesseract. diff --git a/src/lstm/reversed.h b/src/lstm/reversed.h index 68ac5944d4..97c2aebbc0 100644 --- a/src/lstm/reversed.h +++ b/src/lstm/reversed.h @@ -1,89 +1,89 @@ -/////////////////////////////////////////////////////////////////////// -// File: reversed.h -// Description: Runs a single network on time-reversed input, reversing output. -// Author: Ray Smith -// Created: Thu May 02 08:38:06 PST 2013 -// -// (C) Copyright 2013, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -/////////////////////////////////////////////////////////////////////// - -#ifndef TESSERACT_LSTM_REVERSED_H_ -#define TESSERACT_LSTM_REVERSED_H_ - -#include "matrix.h" -#include "plumbing.h" - -namespace tesseract { - -// C++ Implementation of the Reversed class from lstm.py. -class Reversed : public Plumbing { - public: - explicit Reversed(const STRING& name, NetworkType type); - virtual ~Reversed(); - - // Returns the shape output from the network given an input shape (which may - // be partially unknown ie zero). - virtual StaticShape OutputShape(const StaticShape& input_shape) const; - - virtual STRING spec() const { - STRING spec(type_ == NT_XREVERSED ? "Rx" - : (type_ == NT_YREVERSED ? "Ry" : "Txy")); - // For most simple cases, we will output Rx or Ry where is - // the network in stack_[0], but in the special case that is an - // LSTM, we will just output the LSTM's spec modified to take the reversal - // into account. This is because when the user specified Lfy64, we actually - // generated TxyLfx64, and if the user specified Lrx64 we actually - // generated RxLfx64, and we want to display what the user asked for. - STRING net_spec = stack_[0]->spec(); - if (net_spec[0] == 'L') { - // Setup a from and to character according to the type of the reversal - // such that the LSTM spec gets modified to the spec that the user - // asked for - char from = 'f'; - char to = 'r'; - if (type_ == NT_XYTRANSPOSE) { - from = 'x'; - to = 'y'; - } - // Change the from char to the to char. - for (int i = 0; i < net_spec.length(); ++i) { - if (net_spec[i] == from) net_spec[i] = to; - } - return net_spec; - } - spec += net_spec; - return spec; - } - - // Takes ownership of the given network to make it the reversed one. - void SetNetwork(Network* network); - - // Runs forward propagation of activations on the input line. - // See Network for a detailed discussion of the arguments. - virtual void Forward(bool debug, const NetworkIO& input, - const TransposedArray* input_transpose, - NetworkScratch* scratch, NetworkIO* output); - - // Runs backward propagation of errors on the deltas line. - // See Network for a detailed discussion of the arguments. - virtual bool Backward(bool debug, const NetworkIO& fwd_deltas, - NetworkScratch* scratch, - NetworkIO* back_deltas); - - private: - // Copies src to *dest with the reversal according to type_. - void ReverseData(const NetworkIO& src, NetworkIO* dest) const; -}; - -} // namespace tesseract. - -#endif // TESSERACT_LSTM_REVERSED_H_ +/////////////////////////////////////////////////////////////////////// +// File: reversed.h +// Description: Runs a single network on time-reversed input, reversing output. +// Author: Ray Smith +// Created: Thu May 02 08:38:06 PST 2013 +// +// (C) Copyright 2013, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +/////////////////////////////////////////////////////////////////////// + +#ifndef TESSERACT_LSTM_REVERSED_H_ +#define TESSERACT_LSTM_REVERSED_H_ + +#include "matrix.h" +#include "plumbing.h" + +namespace tesseract { + +// C++ Implementation of the Reversed class from lstm.py. +class Reversed : public Plumbing { + public: + explicit Reversed(const STRING& name, NetworkType type); + virtual ~Reversed(); + + // Returns the shape output from the network given an input shape (which may + // be partially unknown ie zero). + virtual StaticShape OutputShape(const StaticShape& input_shape) const; + + virtual STRING spec() const { + STRING spec(type_ == NT_XREVERSED ? "Rx" + : (type_ == NT_YREVERSED ? "Ry" : "Txy")); + // For most simple cases, we will output Rx or Ry where is + // the network in stack_[0], but in the special case that is an + // LSTM, we will just output the LSTM's spec modified to take the reversal + // into account. This is because when the user specified Lfy64, we actually + // generated TxyLfx64, and if the user specified Lrx64 we actually + // generated RxLfx64, and we want to display what the user asked for. + STRING net_spec = stack_[0]->spec(); + if (net_spec[0] == 'L') { + // Setup a from and to character according to the type of the reversal + // such that the LSTM spec gets modified to the spec that the user + // asked for + char from = 'f'; + char to = 'r'; + if (type_ == NT_XYTRANSPOSE) { + from = 'x'; + to = 'y'; + } + // Change the from char to the to char. + for (int i = 0; i < net_spec.length(); ++i) { + if (net_spec[i] == from) net_spec[i] = to; + } + return net_spec; + } + spec += net_spec; + return spec; + } + + // Takes ownership of the given network to make it the reversed one. + void SetNetwork(Network* network); + + // Runs forward propagation of activations on the input line. + // See Network for a detailed discussion of the arguments. + virtual void Forward(bool debug, const NetworkIO& input, + const TransposedArray* input_transpose, + NetworkScratch* scratch, NetworkIO* output); + + // Runs backward propagation of errors on the deltas line. + // See Network for a detailed discussion of the arguments. + virtual bool Backward(bool debug, const NetworkIO& fwd_deltas, + NetworkScratch* scratch, + NetworkIO* back_deltas); + + private: + // Copies src to *dest with the reversal according to type_. + void ReverseData(const NetworkIO& src, NetworkIO* dest) const; +}; + +} // namespace tesseract. + +#endif // TESSERACT_LSTM_REVERSED_H_ diff --git a/src/lstm/static_shape.h b/src/lstm/static_shape.h index b48faca021..4822a5af3b 100644 --- a/src/lstm/static_shape.h +++ b/src/lstm/static_shape.h @@ -1,80 +1,80 @@ -/////////////////////////////////////////////////////////////////////// -// File: static_shape.h -// Description: Defines the size of the 4-d tensor input/output from a network. -// Author: Ray Smith -// Created: Fri Oct 14 09:07:31 PST 2016 -// -// (C) Copyright 2016, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -/////////////////////////////////////////////////////////////////////// -#ifndef TESSERACT_LSTM_STATIC_SHAPE_H_ -#define TESSERACT_LSTM_STATIC_SHAPE_H_ - -#include "tprintf.h" - -namespace tesseract { - -// Enum describing the loss function to apply during training and/or the -// decoding method to apply at runtime. -enum LossType { - LT_NONE, // Undefined. - LT_CTC, // Softmax with standard CTC for training/decoding. - LT_SOFTMAX, // Outputs sum to 1 in fixed positions. - LT_LOGISTIC, // Logistic outputs with independent values. -}; - -// Simple class to hold the tensor shape that is known at network build time -// and the LossType of the loss function. -class StaticShape { - public: - StaticShape() - : batch_(0), height_(0), width_(0), depth_(0), loss_type_(LT_NONE) {} - int batch() const { return batch_; } - void set_batch(int value) { batch_ = value; } - int height() const { return height_; } - void set_height(int value) { height_ = value; } - int width() const { return width_; } - void set_width(int value) { width_ = value; } - int depth() const { return depth_; } - void set_depth(int value) { depth_ = value; } - LossType loss_type() const { return loss_type_; } - void set_loss_type(LossType value) { loss_type_ = value; } - void SetShape(int batch, int height, int width, int depth) { - batch_ = batch; - height_ = height; - width_ = width; - depth_ = depth; - } - - void Print() const { - tprintf("Batch=%d, Height=%d, Width=%d, Depth=%d, loss=%d\n", batch_, - height_, width_, depth_, loss_type_); - } - - private: - // Size of the 4-D tensor input/output to a network. A value of zero is - // allowed for all except depth_ and means to be determined at runtime, and - // regarded as variable. - // Number of elements in a batch, or number of frames in a video stream. - int batch_; - // Height of the image. - int height_; - // Width of the image. - int width_; - // Depth of the image. (Number of "nodes"). - int depth_; - // How to train/interpret the output. - LossType loss_type_; -}; - -} // namespace tesseract - -#endif // TESSERACT_LSTM_STATIC_SHAPE_H_ +/////////////////////////////////////////////////////////////////////// +// File: static_shape.h +// Description: Defines the size of the 4-d tensor input/output from a network. +// Author: Ray Smith +// Created: Fri Oct 14 09:07:31 PST 2016 +// +// (C) Copyright 2016, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +/////////////////////////////////////////////////////////////////////// +#ifndef TESSERACT_LSTM_STATIC_SHAPE_H_ +#define TESSERACT_LSTM_STATIC_SHAPE_H_ + +#include "tprintf.h" + +namespace tesseract { + +// Enum describing the loss function to apply during training and/or the +// decoding method to apply at runtime. +enum LossType { + LT_NONE, // Undefined. + LT_CTC, // Softmax with standard CTC for training/decoding. + LT_SOFTMAX, // Outputs sum to 1 in fixed positions. + LT_LOGISTIC, // Logistic outputs with independent values. +}; + +// Simple class to hold the tensor shape that is known at network build time +// and the LossType of the loss function. +class StaticShape { + public: + StaticShape() + : batch_(0), height_(0), width_(0), depth_(0), loss_type_(LT_NONE) {} + int batch() const { return batch_; } + void set_batch(int value) { batch_ = value; } + int height() const { return height_; } + void set_height(int value) { height_ = value; } + int width() const { return width_; } + void set_width(int value) { width_ = value; } + int depth() const { return depth_; } + void set_depth(int value) { depth_ = value; } + LossType loss_type() const { return loss_type_; } + void set_loss_type(LossType value) { loss_type_ = value; } + void SetShape(int batch, int height, int width, int depth) { + batch_ = batch; + height_ = height; + width_ = width; + depth_ = depth; + } + + void Print() const { + tprintf("Batch=%d, Height=%d, Width=%d, Depth=%d, loss=%d\n", batch_, + height_, width_, depth_, loss_type_); + } + + private: + // Size of the 4-D tensor input/output to a network. A value of zero is + // allowed for all except depth_ and means to be determined at runtime, and + // regarded as variable. + // Number of elements in a batch, or number of frames in a video stream. + int batch_; + // Height of the image. + int height_; + // Width of the image. + int width_; + // Depth of the image. (Number of "nodes"). + int depth_; + // How to train/interpret the output. + LossType loss_type_; +}; + +} // namespace tesseract + +#endif // TESSERACT_LSTM_STATIC_SHAPE_H_ diff --git a/src/lstm/stridemap.cpp b/src/lstm/stridemap.cpp index 49567c56f2..26a2cf6669 100644 --- a/src/lstm/stridemap.cpp +++ b/src/lstm/stridemap.cpp @@ -1,174 +1,174 @@ -/////////////////////////////////////////////////////////////////////// -// File: stridemap.cpp -// Description: Indexing into a 4-d tensor held in a 2-d Array. -// Author: Ray Smith -// Created: Fri Sep 20 15:30:31 PST 2016 -// -// (C) Copyright 2016, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -/////////////////////////////////////////////////////////////////////// - -#include "stridemap.h" - -namespace tesseract { - -// Returns true if *this is a valid index. -bool StrideMap::Index::IsValid() const { - // Cheap check first. - for (int d = 0; d < FD_DIMSIZE; ++d) { - if (indices_[d] < 0) return false; - } - for (int d = 0; d < FD_DIMSIZE; ++d) { - if (indices_[d] > MaxIndexOfDim(static_cast(d))) - return false; - } - return true; -} - -// Returns true if the index of the given dimension is the last. -bool StrideMap::Index::IsLast(FlexDimensions dimension) const { - return MaxIndexOfDim(dimension) == indices_[dimension]; -} - -// Given that the dimensions up to and including dim-1 are valid, returns the -// maximum index for dimension dim. -int StrideMap::Index::MaxIndexOfDim(FlexDimensions dim) const { - int max_index = stride_map_->shape_[dim] - 1; - if (dim == FD_BATCH) return max_index; - assert(0 <= indices_[FD_BATCH]); - const size_t batch = indices_[FD_BATCH]; - if (dim == FD_HEIGHT) { - if (batch >= stride_map_->heights_.size() || - stride_map_->heights_[batch] > max_index) - return max_index; - return stride_map_->heights_[batch] - 1; - } - if (batch >= stride_map_->widths_.size() || - stride_map_->widths_[batch] > max_index) - return max_index; - return stride_map_->widths_[batch] - 1; -} - -// Adds the given offset to the given dimension. Returns true if the result -// makes a valid index. -bool StrideMap::Index::AddOffset(int offset, FlexDimensions dimension) { - indices_[dimension] += offset; - SetTFromIndices(); - return IsValid(); -} - -// Increments the index in some encapsulated way that guarantees to remain -// valid until it returns false, meaning that the iteration is complete. -bool StrideMap::Index::Increment() { - for (int d = FD_DIMSIZE - 1; d >= 0; --d) { - if (!IsLast(static_cast(d))) { - t_ += stride_map_->t_increments_[d]; - ++indices_[d]; - return true; - } - t_ -= stride_map_->t_increments_[d] * indices_[d]; - indices_[d] = 0; - // Now carry to the next dimension. - } - return false; -} - -// Decrements the index in some encapsulated way that guarantees to remain -// valid until it returns false, meaning that the iteration (that started -// with InitToLast()) is complete. -bool StrideMap::Index::Decrement() { - for (int d = FD_DIMSIZE - 1; d >= 0; --d) { - if (indices_[d] > 0) { - --indices_[d]; - if (d == FD_BATCH) { - // The upper limits of the other dimensions may have changed as a result - // of a different batch index, so they have to be reset. - InitToLastOfBatch(indices_[FD_BATCH]); - } else { - t_ -= stride_map_->t_increments_[d]; - } - return true; - } - indices_[d] = MaxIndexOfDim(static_cast(d)); - t_ += stride_map_->t_increments_[d] * indices_[d]; - // Now borrow from the next dimension. - } - return false; -} - -// Initializes the indices to the last valid location in the given batch -// index. -void StrideMap::Index::InitToLastOfBatch(int batch) { - indices_[FD_BATCH] = batch; - for (int d = FD_BATCH + 1; d < FD_DIMSIZE; ++d) { - indices_[d] = MaxIndexOfDim(static_cast(d)); - } - SetTFromIndices(); -} - -// Computes and sets t_ from the current indices_. -void StrideMap::Index::SetTFromIndices() { - t_ = 0; - for (int d = 0; d < FD_DIMSIZE; ++d) { - t_ += stride_map_->t_increments_[d] * indices_[d]; - } -} - -// Sets up the stride for the given array of height, width pairs. -void StrideMap::SetStride(const std::vector>& h_w_pairs) { - int max_height = 0; - int max_width = 0; - for (const std::pair& hw : h_w_pairs) { - int height = hw.first; - int width = hw.second; - heights_.push_back(height); - widths_.push_back(width); - if (height > max_height) max_height = height; - if (width > max_width) max_width = width; - } - shape_[FD_BATCH] = heights_.size(); - shape_[FD_HEIGHT] = max_height; - shape_[FD_WIDTH] = max_width; - ComputeTIncrements(); -} - -// Scales width and height dimensions by the given factors. -void StrideMap::ScaleXY(int x_factor, int y_factor) { - for (int& height : heights_) height /= y_factor; - for (int& width : widths_) width /= x_factor; - shape_[FD_HEIGHT] /= y_factor; - shape_[FD_WIDTH] /= x_factor; - ComputeTIncrements(); -} - -// Reduces width to 1, across the batch, whatever the input size. -void StrideMap::ReduceWidthTo1() { - widths_.assign(widths_.size(), 1); - shape_[FD_WIDTH] = 1; - ComputeTIncrements(); -} - -// Transposes the width and height dimensions. -void StrideMap::TransposeXY() { - std::swap(shape_[FD_HEIGHT], shape_[FD_WIDTH]); - std::swap(heights_, widths_); - ComputeTIncrements(); -} - -// Computes t_increments_ from shape_. -void StrideMap::ComputeTIncrements() { - t_increments_[FD_DIMSIZE - 1] = 1; - for (int d = FD_DIMSIZE - 2; d >= 0; --d) { - t_increments_[d] = t_increments_[d + 1] * shape_[d + 1]; - } -} - -} // namespace tesseract +/////////////////////////////////////////////////////////////////////// +// File: stridemap.cpp +// Description: Indexing into a 4-d tensor held in a 2-d Array. +// Author: Ray Smith +// Created: Fri Sep 20 15:30:31 PST 2016 +// +// (C) Copyright 2016, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +/////////////////////////////////////////////////////////////////////// + +#include "stridemap.h" + +namespace tesseract { + +// Returns true if *this is a valid index. +bool StrideMap::Index::IsValid() const { + // Cheap check first. + for (int d = 0; d < FD_DIMSIZE; ++d) { + if (indices_[d] < 0) return false; + } + for (int d = 0; d < FD_DIMSIZE; ++d) { + if (indices_[d] > MaxIndexOfDim(static_cast(d))) + return false; + } + return true; +} + +// Returns true if the index of the given dimension is the last. +bool StrideMap::Index::IsLast(FlexDimensions dimension) const { + return MaxIndexOfDim(dimension) == indices_[dimension]; +} + +// Given that the dimensions up to and including dim-1 are valid, returns the +// maximum index for dimension dim. +int StrideMap::Index::MaxIndexOfDim(FlexDimensions dim) const { + int max_index = stride_map_->shape_[dim] - 1; + if (dim == FD_BATCH) return max_index; + assert(0 <= indices_[FD_BATCH]); + const size_t batch = indices_[FD_BATCH]; + if (dim == FD_HEIGHT) { + if (batch >= stride_map_->heights_.size() || + stride_map_->heights_[batch] > max_index) + return max_index; + return stride_map_->heights_[batch] - 1; + } + if (batch >= stride_map_->widths_.size() || + stride_map_->widths_[batch] > max_index) + return max_index; + return stride_map_->widths_[batch] - 1; +} + +// Adds the given offset to the given dimension. Returns true if the result +// makes a valid index. +bool StrideMap::Index::AddOffset(int offset, FlexDimensions dimension) { + indices_[dimension] += offset; + SetTFromIndices(); + return IsValid(); +} + +// Increments the index in some encapsulated way that guarantees to remain +// valid until it returns false, meaning that the iteration is complete. +bool StrideMap::Index::Increment() { + for (int d = FD_DIMSIZE - 1; d >= 0; --d) { + if (!IsLast(static_cast(d))) { + t_ += stride_map_->t_increments_[d]; + ++indices_[d]; + return true; + } + t_ -= stride_map_->t_increments_[d] * indices_[d]; + indices_[d] = 0; + // Now carry to the next dimension. + } + return false; +} + +// Decrements the index in some encapsulated way that guarantees to remain +// valid until it returns false, meaning that the iteration (that started +// with InitToLast()) is complete. +bool StrideMap::Index::Decrement() { + for (int d = FD_DIMSIZE - 1; d >= 0; --d) { + if (indices_[d] > 0) { + --indices_[d]; + if (d == FD_BATCH) { + // The upper limits of the other dimensions may have changed as a result + // of a different batch index, so they have to be reset. + InitToLastOfBatch(indices_[FD_BATCH]); + } else { + t_ -= stride_map_->t_increments_[d]; + } + return true; + } + indices_[d] = MaxIndexOfDim(static_cast(d)); + t_ += stride_map_->t_increments_[d] * indices_[d]; + // Now borrow from the next dimension. + } + return false; +} + +// Initializes the indices to the last valid location in the given batch +// index. +void StrideMap::Index::InitToLastOfBatch(int batch) { + indices_[FD_BATCH] = batch; + for (int d = FD_BATCH + 1; d < FD_DIMSIZE; ++d) { + indices_[d] = MaxIndexOfDim(static_cast(d)); + } + SetTFromIndices(); +} + +// Computes and sets t_ from the current indices_. +void StrideMap::Index::SetTFromIndices() { + t_ = 0; + for (int d = 0; d < FD_DIMSIZE; ++d) { + t_ += stride_map_->t_increments_[d] * indices_[d]; + } +} + +// Sets up the stride for the given array of height, width pairs. +void StrideMap::SetStride(const std::vector>& h_w_pairs) { + int max_height = 0; + int max_width = 0; + for (const std::pair& hw : h_w_pairs) { + int height = hw.first; + int width = hw.second; + heights_.push_back(height); + widths_.push_back(width); + if (height > max_height) max_height = height; + if (width > max_width) max_width = width; + } + shape_[FD_BATCH] = heights_.size(); + shape_[FD_HEIGHT] = max_height; + shape_[FD_WIDTH] = max_width; + ComputeTIncrements(); +} + +// Scales width and height dimensions by the given factors. +void StrideMap::ScaleXY(int x_factor, int y_factor) { + for (int& height : heights_) height /= y_factor; + for (int& width : widths_) width /= x_factor; + shape_[FD_HEIGHT] /= y_factor; + shape_[FD_WIDTH] /= x_factor; + ComputeTIncrements(); +} + +// Reduces width to 1, across the batch, whatever the input size. +void StrideMap::ReduceWidthTo1() { + widths_.assign(widths_.size(), 1); + shape_[FD_WIDTH] = 1; + ComputeTIncrements(); +} + +// Transposes the width and height dimensions. +void StrideMap::TransposeXY() { + std::swap(shape_[FD_HEIGHT], shape_[FD_WIDTH]); + std::swap(heights_, widths_); + ComputeTIncrements(); +} + +// Computes t_increments_ from shape_. +void StrideMap::ComputeTIncrements() { + t_increments_[FD_DIMSIZE - 1] = 1; + for (int d = FD_DIMSIZE - 2; d >= 0; --d) { + t_increments_[d] = t_increments_[d + 1] * shape_[d + 1]; + } +} + +} // namespace tesseract diff --git a/src/lstm/stridemap.h b/src/lstm/stridemap.h index e0750292f2..2dd9e49b7d 100644 --- a/src/lstm/stridemap.h +++ b/src/lstm/stridemap.h @@ -1,137 +1,137 @@ -/////////////////////////////////////////////////////////////////////// -// File: stridemap.h -// Description: Indexing into a 4-d tensor held in a 2-d Array. -// Author: Ray Smith -// Created: Fri Sep 20 16:00:31 PST 2016 -// -// (C) Copyright 2016, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -/////////////////////////////////////////////////////////////////////// -#ifndef TESSERACT_LSTM_STRIDEMAP_H_ -#define TESSERACT_LSTM_STRIDEMAP_H_ - -#include -#include -#include "tprintf.h" - -namespace tesseract { - -// Enum describing the dimensions of the 'Tensor' in a NetworkIO. -// A NetworkIO is analogous to a TF Tensor, except that the number of dimensions -// is fixed (4), and they always have the same meaning. The underlying -// representation is a 2-D array, for which the product batch*height*width -// is always dim1 and depth is always dim2. FlexDimensions is used only for -// batch, height, width with the StrideMap, and therefore represents the runtime -// shape. The build-time shape is defined by StaticShape. -enum FlexDimensions { - FD_BATCH, // Index of multiple images. - FD_HEIGHT, // y-coordinate in image. - FD_WIDTH, // x-coordinate in image. - FD_DIMSIZE, // Number of flexible non-depth dimensions. -}; - -// Encapsulation of information relating to the mapping from [batch][y][x] to -// the first index into the 2-d array underlying a NetworkIO. -class StrideMap { - public: - // Class holding the non-depth indices. - class Index { - public: - explicit Index(const StrideMap& stride_map) : stride_map_(&stride_map) { - InitToFirst(); - } - Index(const StrideMap& stride_map, int batch, int y, int x) - : stride_map_(&stride_map) { - indices_[FD_BATCH] = batch; - indices_[FD_HEIGHT] = y; - indices_[FD_WIDTH] = x; - SetTFromIndices(); - } - // Accesses the index to the underlying array. - int t() const { return t_; } - int index(FlexDimensions dimension) const { return indices_[dimension]; } - // Initializes the indices to the first valid location. - void InitToFirst() { - memset(indices_, 0, sizeof(indices_)); - t_ = 0; - } - // Initializes the indices to the last valid location. - void InitToLast() { InitToLastOfBatch(MaxIndexOfDim(FD_BATCH)); } - // Returns true if *this is a valid index. - bool IsValid() const; - // Returns true if the index of the given dimension is the last. - bool IsLast(FlexDimensions dimension) const; - // Given that the dimensions up to and including dim-1 are valid, returns - // the maximum index for dimension dim. - int MaxIndexOfDim(FlexDimensions dim) const; - // Adds the given offset to the given dimension. Returns true if the result - // makes a valid index. - bool AddOffset(int offset, FlexDimensions dimension); - // Increments the index in some encapsulated way that guarantees to remain - // valid until it returns false, meaning that the iteration is complete. - bool Increment(); - // Decrements the index in some encapsulated way that guarantees to remain - // valid until it returns false, meaning that the iteration (that started - // with InitToLast()) is complete. - bool Decrement(); - - private: - // Initializes the indices to the last valid location in the given batch - // index. - void InitToLastOfBatch(int batch); - // Computes and sets t_ from the current indices_. - void SetTFromIndices(); - - // Map into which *this is an index. - const StrideMap* stride_map_; - // Index to the first dimension of the underlying array. - int t_; - // Indices into the individual dimensions. - int indices_[FD_DIMSIZE]; - }; - - StrideMap() { - memset(shape_, 0, sizeof(shape_)); - memset(t_increments_, 0, sizeof(t_increments_)); - } - // Default copy constructor and operator= are OK to use here! - - // Sets up the stride for the given array of height, width pairs. - void SetStride(const std::vector>& h_w_pairs); - // Scales width and height dimensions by the given factors. - void ScaleXY(int x_factor, int y_factor); - // Reduces width to 1, across the batch, whatever the input size. - void ReduceWidthTo1(); - // Transposes the width and height dimensions. - void TransposeXY(); - // Returns the size of the given dimension. - int Size(FlexDimensions dimension) const { return shape_[dimension]; } - // Returns the total width required. - int Width() const { return t_increments_[FD_BATCH] * shape_[FD_BATCH]; } - - private: - // Computes t_increments_ from shape_. - void ComputeTIncrements(); - - // The size of each non-depth dimension. - int shape_[FD_DIMSIZE]; - // Precomputed 't' increments for each dimension. This is the value of - // the given dimension in the packed 3-d array that the shape_ represents. - int t_increments_[FD_DIMSIZE]; - // Vector of size shape_[FD_BATCH] holds the height of each image in a batch. - std::vector heights_; - // Vector of size shape_[FD_BATCH] holds the width of each image in a batch. - std::vector widths_; -}; - -} // namespace tesseract - -#endif // TESSERACT_LSTM_STRIDEMAP_H_ +/////////////////////////////////////////////////////////////////////// +// File: stridemap.h +// Description: Indexing into a 4-d tensor held in a 2-d Array. +// Author: Ray Smith +// Created: Fri Sep 20 16:00:31 PST 2016 +// +// (C) Copyright 2016, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +/////////////////////////////////////////////////////////////////////// +#ifndef TESSERACT_LSTM_STRIDEMAP_H_ +#define TESSERACT_LSTM_STRIDEMAP_H_ + +#include +#include +#include "tprintf.h" + +namespace tesseract { + +// Enum describing the dimensions of the 'Tensor' in a NetworkIO. +// A NetworkIO is analogous to a TF Tensor, except that the number of dimensions +// is fixed (4), and they always have the same meaning. The underlying +// representation is a 2-D array, for which the product batch*height*width +// is always dim1 and depth is always dim2. FlexDimensions is used only for +// batch, height, width with the StrideMap, and therefore represents the runtime +// shape. The build-time shape is defined by StaticShape. +enum FlexDimensions { + FD_BATCH, // Index of multiple images. + FD_HEIGHT, // y-coordinate in image. + FD_WIDTH, // x-coordinate in image. + FD_DIMSIZE, // Number of flexible non-depth dimensions. +}; + +// Encapsulation of information relating to the mapping from [batch][y][x] to +// the first index into the 2-d array underlying a NetworkIO. +class StrideMap { + public: + // Class holding the non-depth indices. + class Index { + public: + explicit Index(const StrideMap& stride_map) : stride_map_(&stride_map) { + InitToFirst(); + } + Index(const StrideMap& stride_map, int batch, int y, int x) + : stride_map_(&stride_map) { + indices_[FD_BATCH] = batch; + indices_[FD_HEIGHT] = y; + indices_[FD_WIDTH] = x; + SetTFromIndices(); + } + // Accesses the index to the underlying array. + int t() const { return t_; } + int index(FlexDimensions dimension) const { return indices_[dimension]; } + // Initializes the indices to the first valid location. + void InitToFirst() { + memset(indices_, 0, sizeof(indices_)); + t_ = 0; + } + // Initializes the indices to the last valid location. + void InitToLast() { InitToLastOfBatch(MaxIndexOfDim(FD_BATCH)); } + // Returns true if *this is a valid index. + bool IsValid() const; + // Returns true if the index of the given dimension is the last. + bool IsLast(FlexDimensions dimension) const; + // Given that the dimensions up to and including dim-1 are valid, returns + // the maximum index for dimension dim. + int MaxIndexOfDim(FlexDimensions dim) const; + // Adds the given offset to the given dimension. Returns true if the result + // makes a valid index. + bool AddOffset(int offset, FlexDimensions dimension); + // Increments the index in some encapsulated way that guarantees to remain + // valid until it returns false, meaning that the iteration is complete. + bool Increment(); + // Decrements the index in some encapsulated way that guarantees to remain + // valid until it returns false, meaning that the iteration (that started + // with InitToLast()) is complete. + bool Decrement(); + + private: + // Initializes the indices to the last valid location in the given batch + // index. + void InitToLastOfBatch(int batch); + // Computes and sets t_ from the current indices_. + void SetTFromIndices(); + + // Map into which *this is an index. + const StrideMap* stride_map_; + // Index to the first dimension of the underlying array. + int t_; + // Indices into the individual dimensions. + int indices_[FD_DIMSIZE]; + }; + + StrideMap() { + memset(shape_, 0, sizeof(shape_)); + memset(t_increments_, 0, sizeof(t_increments_)); + } + // Default copy constructor and operator= are OK to use here! + + // Sets up the stride for the given array of height, width pairs. + void SetStride(const std::vector>& h_w_pairs); + // Scales width and height dimensions by the given factors. + void ScaleXY(int x_factor, int y_factor); + // Reduces width to 1, across the batch, whatever the input size. + void ReduceWidthTo1(); + // Transposes the width and height dimensions. + void TransposeXY(); + // Returns the size of the given dimension. + int Size(FlexDimensions dimension) const { return shape_[dimension]; } + // Returns the total width required. + int Width() const { return t_increments_[FD_BATCH] * shape_[FD_BATCH]; } + + private: + // Computes t_increments_ from shape_. + void ComputeTIncrements(); + + // The size of each non-depth dimension. + int shape_[FD_DIMSIZE]; + // Precomputed 't' increments for each dimension. This is the value of + // the given dimension in the packed 3-d array that the shape_ represents. + int t_increments_[FD_DIMSIZE]; + // Vector of size shape_[FD_BATCH] holds the height of each image in a batch. + std::vector heights_; + // Vector of size shape_[FD_BATCH] holds the width of each image in a batch. + std::vector widths_; +}; + +} // namespace tesseract + +#endif // TESSERACT_LSTM_STRIDEMAP_H_ diff --git a/src/lstm/tfnetwork.cpp b/src/lstm/tfnetwork.cpp index ec625a1668..3d24881af1 100644 --- a/src/lstm/tfnetwork.cpp +++ b/src/lstm/tfnetwork.cpp @@ -1,148 +1,148 @@ -/////////////////////////////////////////////////////////////////////// -// File: tfnetwork.cpp -// Description: Encapsulation of an entire tensorflow graph as a -// Tesseract Network. -// Author: Ray Smith -// Created: Fri Feb 26 09:35:29 PST 2016 -// -// (C) Copyright 2016, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -/////////////////////////////////////////////////////////////////////// -#ifdef INCLUDE_TENSORFLOW - -#include "tfnetwork.h" - -#include "allheaders.h" -#include "input.h" -#include "networkscratch.h" - -using tensorflow::Status; -using tensorflow::Tensor; -using tensorflow::TensorShape; - -namespace tesseract { - -TFNetwork::TFNetwork(const STRING& name) : Network(NT_TENSORFLOW, name, 0, 0) {} - -TFNetwork::~TFNetwork() {} - -int TFNetwork::InitFromProtoStr(const string& proto_str) { - if (!model_proto_.ParseFromString(proto_str)) return 0; - return InitFromProto(); -} - -// Writes to the given file. Returns false in case of error. -// Should be overridden by subclasses, but called by their Serialize. -bool TFNetwork::Serialize(TFile* fp) const { - if (!Network::Serialize(fp)) return false; - string proto_str; - model_proto_.SerializeToString(&proto_str); - GenericVector data; - data.resize_no_init(proto_str.size()); - memcpy(&data[0], proto_str.data(), proto_str.size()); - if (!data.Serialize(fp)) return false; - return true; -} - -// Reads from the given file. Returns false in case of error. -// Should be overridden by subclasses, but NOT called by their DeSerialize. -bool TFNetwork::DeSerialize(TFile* fp) { - GenericVector data; - if (!data.DeSerialize(fp)) return false; - if (!model_proto_.ParseFromArray(&data[0], data.size())) { - return false; - } - return InitFromProto(); -} - -// Runs forward propagation of activations on the input line. -// See Network for a detailed discussion of the arguments. -void TFNetwork::Forward(bool debug, const NetworkIO& input, - const TransposedArray* input_transpose, - NetworkScratch* scratch, NetworkIO* output) { - std::vector> tf_inputs; - int depth = input_shape_.depth(); - ASSERT_HOST(depth == input.NumFeatures()); - // TODO(rays) Allow batching. For now batch_size = 1. - const StrideMap& stride_map = input.stride_map(); - // TF requires a tensor of shape float[batch, height, width, depth]. - TensorShape shape{1, stride_map.Size(FD_HEIGHT), stride_map.Size(FD_WIDTH), - depth}; - Tensor input_tensor(tensorflow::DT_FLOAT, shape); - // The flat() member gives a 1d array, with a data() member to get the data. - auto eigen_tensor = input_tensor.flat(); - memcpy(eigen_tensor.data(), input.f(0), - input.Width() * depth * sizeof(input.f(0)[0])); - // Add the tensor to the vector of inputs. - tf_inputs.emplace_back(model_proto_.image_input(), input_tensor); - - // Provide tensors giving the width and/or height of the image if they are - // required. Some tf ops require a separate tensor with knowledge of the - // size of the input as they cannot obtain it from the input tensor. This is - // usually true in the case of ops that process a batch of variable-sized - // objects. - if (!model_proto_.image_widths().empty()) { - TensorShape size_shape{1}; - Tensor width_tensor(tensorflow::DT_INT64, size_shape); - auto eigen_wtensor = width_tensor.flat(); - *eigen_wtensor.data() = stride_map.Size(FD_WIDTH); - tf_inputs.emplace_back(model_proto_.image_widths(), width_tensor); - } - if (!model_proto_.image_heights().empty()) { - TensorShape size_shape{1}; - Tensor height_tensor(tensorflow::DT_INT64, size_shape); - auto eigen_htensor = height_tensor.flat(); - *eigen_htensor.data() = stride_map.Size(FD_HEIGHT); - tf_inputs.emplace_back(model_proto_.image_heights(), height_tensor); - } - std::vector target_layers = {model_proto_.output_layer()}; - std::vector outputs; - Status s = session_->Run(tf_inputs, target_layers, {}, &outputs); - if (!s.ok()) tprintf("session->Run failed:%s\n", s.error_message().c_str()); - ASSERT_HOST(s.ok()); - ASSERT_HOST(outputs.size() == 1); - const Tensor& output_tensor = outputs[0]; - // Check the dimensions of the output. - ASSERT_HOST(output_tensor.shape().dims() == 3); - int output_batch = output_tensor.shape().dim_size(0); - int output_steps = output_tensor.shape().dim_size(1); - int output_depth = output_tensor.shape().dim_size(2); - ASSERT_HOST(output_batch == 1); - ASSERT_HOST(output_depth == output_shape_.depth()); - output->Resize2d(false, output_steps, output_depth); - auto eigen_output = output_tensor.flat(); - memcpy(output->f(0), eigen_output.data(), - output_steps * output_depth * sizeof(output->f(0)[0])); -} - -int TFNetwork::InitFromProto() { - spec_ = model_proto_.spec(); - input_shape_.SetShape( - model_proto_.batch_size(), std::max(0, model_proto_.y_size()), - std::max(0, model_proto_.x_size()), model_proto_.depth()); - output_shape_.SetShape(model_proto_.batch_size(), 1, 0, - model_proto_.num_classes()); - output_shape_.set_loss_type(model_proto_.using_ctc() ? LT_CTC : LT_SOFTMAX); - ni_ = input_shape_.height(); - no_ = output_shape_.depth(); - // Initialize the session_ with the graph. Since we can't get the graph - // back from the session_, we have to keep the proto as well - tensorflow::SessionOptions options; - session_.reset(NewSession(options)); - Status s = session_->Create(model_proto_.graph()); - if (s.ok()) return model_proto_.global_step(); - tprintf("Session_->Create returned '%s'\n", s.error_message().c_str()); - return 0; -} - -} // namespace tesseract - -#endif // ifdef INCLUDE_TENSORFLOW +/////////////////////////////////////////////////////////////////////// +// File: tfnetwork.cpp +// Description: Encapsulation of an entire tensorflow graph as a +// Tesseract Network. +// Author: Ray Smith +// Created: Fri Feb 26 09:35:29 PST 2016 +// +// (C) Copyright 2016, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +/////////////////////////////////////////////////////////////////////// +#ifdef INCLUDE_TENSORFLOW + +#include "tfnetwork.h" + +#include "allheaders.h" +#include "input.h" +#include "networkscratch.h" + +using tensorflow::Status; +using tensorflow::Tensor; +using tensorflow::TensorShape; + +namespace tesseract { + +TFNetwork::TFNetwork(const STRING& name) : Network(NT_TENSORFLOW, name, 0, 0) {} + +TFNetwork::~TFNetwork() {} + +int TFNetwork::InitFromProtoStr(const string& proto_str) { + if (!model_proto_.ParseFromString(proto_str)) return 0; + return InitFromProto(); +} + +// Writes to the given file. Returns false in case of error. +// Should be overridden by subclasses, but called by their Serialize. +bool TFNetwork::Serialize(TFile* fp) const { + if (!Network::Serialize(fp)) return false; + string proto_str; + model_proto_.SerializeToString(&proto_str); + GenericVector data; + data.resize_no_init(proto_str.size()); + memcpy(&data[0], proto_str.data(), proto_str.size()); + if (!data.Serialize(fp)) return false; + return true; +} + +// Reads from the given file. Returns false in case of error. +// Should be overridden by subclasses, but NOT called by their DeSerialize. +bool TFNetwork::DeSerialize(TFile* fp) { + GenericVector data; + if (!data.DeSerialize(fp)) return false; + if (!model_proto_.ParseFromArray(&data[0], data.size())) { + return false; + } + return InitFromProto(); +} + +// Runs forward propagation of activations on the input line. +// See Network for a detailed discussion of the arguments. +void TFNetwork::Forward(bool debug, const NetworkIO& input, + const TransposedArray* input_transpose, + NetworkScratch* scratch, NetworkIO* output) { + std::vector> tf_inputs; + int depth = input_shape_.depth(); + ASSERT_HOST(depth == input.NumFeatures()); + // TODO(rays) Allow batching. For now batch_size = 1. + const StrideMap& stride_map = input.stride_map(); + // TF requires a tensor of shape float[batch, height, width, depth]. + TensorShape shape{1, stride_map.Size(FD_HEIGHT), stride_map.Size(FD_WIDTH), + depth}; + Tensor input_tensor(tensorflow::DT_FLOAT, shape); + // The flat() member gives a 1d array, with a data() member to get the data. + auto eigen_tensor = input_tensor.flat(); + memcpy(eigen_tensor.data(), input.f(0), + input.Width() * depth * sizeof(input.f(0)[0])); + // Add the tensor to the vector of inputs. + tf_inputs.emplace_back(model_proto_.image_input(), input_tensor); + + // Provide tensors giving the width and/or height of the image if they are + // required. Some tf ops require a separate tensor with knowledge of the + // size of the input as they cannot obtain it from the input tensor. This is + // usually true in the case of ops that process a batch of variable-sized + // objects. + if (!model_proto_.image_widths().empty()) { + TensorShape size_shape{1}; + Tensor width_tensor(tensorflow::DT_INT64, size_shape); + auto eigen_wtensor = width_tensor.flat(); + *eigen_wtensor.data() = stride_map.Size(FD_WIDTH); + tf_inputs.emplace_back(model_proto_.image_widths(), width_tensor); + } + if (!model_proto_.image_heights().empty()) { + TensorShape size_shape{1}; + Tensor height_tensor(tensorflow::DT_INT64, size_shape); + auto eigen_htensor = height_tensor.flat(); + *eigen_htensor.data() = stride_map.Size(FD_HEIGHT); + tf_inputs.emplace_back(model_proto_.image_heights(), height_tensor); + } + std::vector target_layers = {model_proto_.output_layer()}; + std::vector outputs; + Status s = session_->Run(tf_inputs, target_layers, {}, &outputs); + if (!s.ok()) tprintf("session->Run failed:%s\n", s.error_message().c_str()); + ASSERT_HOST(s.ok()); + ASSERT_HOST(outputs.size() == 1); + const Tensor& output_tensor = outputs[0]; + // Check the dimensions of the output. + ASSERT_HOST(output_tensor.shape().dims() == 3); + int output_batch = output_tensor.shape().dim_size(0); + int output_steps = output_tensor.shape().dim_size(1); + int output_depth = output_tensor.shape().dim_size(2); + ASSERT_HOST(output_batch == 1); + ASSERT_HOST(output_depth == output_shape_.depth()); + output->Resize2d(false, output_steps, output_depth); + auto eigen_output = output_tensor.flat(); + memcpy(output->f(0), eigen_output.data(), + output_steps * output_depth * sizeof(output->f(0)[0])); +} + +int TFNetwork::InitFromProto() { + spec_ = model_proto_.spec(); + input_shape_.SetShape( + model_proto_.batch_size(), std::max(0, model_proto_.y_size()), + std::max(0, model_proto_.x_size()), model_proto_.depth()); + output_shape_.SetShape(model_proto_.batch_size(), 1, 0, + model_proto_.num_classes()); + output_shape_.set_loss_type(model_proto_.using_ctc() ? LT_CTC : LT_SOFTMAX); + ni_ = input_shape_.height(); + no_ = output_shape_.depth(); + // Initialize the session_ with the graph. Since we can't get the graph + // back from the session_, we have to keep the proto as well + tensorflow::SessionOptions options; + session_.reset(NewSession(options)); + Status s = session_->Create(model_proto_.graph()); + if (s.ok()) return model_proto_.global_step(); + tprintf("Session_->Create returned '%s'\n", s.error_message().c_str()); + return 0; +} + +} // namespace tesseract + +#endif // ifdef INCLUDE_TENSORFLOW diff --git a/src/lstm/tfnetwork.h b/src/lstm/tfnetwork.h index 01e505b747..e796f00fa5 100644 --- a/src/lstm/tfnetwork.h +++ b/src/lstm/tfnetwork.h @@ -1,90 +1,90 @@ -/////////////////////////////////////////////////////////////////////// -// File: tfnetwork.h -// Description: Encapsulation of an entire tensorflow graph as a -// Tesseract Network. -// Author: Ray Smith -// Created: Fri Feb 26 09:35:29 PST 2016 -// -// (C) Copyright 2016, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -/////////////////////////////////////////////////////////////////////// - -#ifndef TESSERACT_LSTM_TFNETWORK_H_ -#define TESSERACT_LSTM_TFNETWORK_H_ - -#ifdef INCLUDE_TENSORFLOW - -#include -#include - -#include "network.h" -#include "static_shape.h" -#include "tfnetwork.proto.h" -#include "third_party/tensorflow/core/framework/graph.pb.h" -#include "third_party/tensorflow/core/public/session.h" - -namespace tesseract { - -class TFNetwork : public Network { - public: - explicit TFNetwork(const STRING& name); - virtual ~TFNetwork(); - - // Returns the required shape input to the network. - virtual StaticShape InputShape() const { return input_shape_; } - // Returns the shape output from the network given an input shape (which may - // be partially unknown ie zero). - virtual StaticShape OutputShape(const StaticShape& input_shape) const { - return output_shape_; - } - - virtual STRING spec() const { return spec_.c_str(); } - - // Deserializes *this from a serialized TFNetwork proto. Returns 0 if failed, - // otherwise the global step of the serialized graph. - int InitFromProtoStr(const string& proto_str); - // The number of classes in this network should be equal to those in the - // recoder_ in LSTMRecognizer. - int num_classes() const { return output_shape_.depth(); } - - // Writes to the given file. Returns false in case of error. - // Should be overridden by subclasses, but called by their Serialize. - virtual bool Serialize(TFile* fp) const; - // Reads from the given file. Returns false in case of error. - // Should be overridden by subclasses, but NOT called by their DeSerialize. - virtual bool DeSerialize(TFile* fp); - - // Runs forward propagation of activations on the input line. - // See Network for a detailed discussion of the arguments. - virtual void Forward(bool debug, const NetworkIO& input, - const TransposedArray* input_transpose, - NetworkScratch* scratch, NetworkIO* output); - - private: - int InitFromProto(); - - // The original network definition for reference. - string spec_; - // Input tensor parameters. - StaticShape input_shape_; - // Output tensor parameters. - StaticShape output_shape_; - // The tensor flow graph is contained in here. - std::unique_ptr session_; - // The serialized graph is also contained in here. - TFNetworkModel model_proto_; -}; - -} // namespace tesseract. - -#endif // ifdef INCLUDE_TENSORFLOW - -#endif // TESSERACT_TENSORFLOW_TFNETWORK_H_ +/////////////////////////////////////////////////////////////////////// +// File: tfnetwork.h +// Description: Encapsulation of an entire tensorflow graph as a +// Tesseract Network. +// Author: Ray Smith +// Created: Fri Feb 26 09:35:29 PST 2016 +// +// (C) Copyright 2016, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +/////////////////////////////////////////////////////////////////////// + +#ifndef TESSERACT_LSTM_TFNETWORK_H_ +#define TESSERACT_LSTM_TFNETWORK_H_ + +#ifdef INCLUDE_TENSORFLOW + +#include +#include + +#include "network.h" +#include "static_shape.h" +#include "tfnetwork.proto.h" +#include "third_party/tensorflow/core/framework/graph.pb.h" +#include "third_party/tensorflow/core/public/session.h" + +namespace tesseract { + +class TFNetwork : public Network { + public: + explicit TFNetwork(const STRING& name); + virtual ~TFNetwork(); + + // Returns the required shape input to the network. + virtual StaticShape InputShape() const { return input_shape_; } + // Returns the shape output from the network given an input shape (which may + // be partially unknown ie zero). + virtual StaticShape OutputShape(const StaticShape& input_shape) const { + return output_shape_; + } + + virtual STRING spec() const { return spec_.c_str(); } + + // Deserializes *this from a serialized TFNetwork proto. Returns 0 if failed, + // otherwise the global step of the serialized graph. + int InitFromProtoStr(const string& proto_str); + // The number of classes in this network should be equal to those in the + // recoder_ in LSTMRecognizer. + int num_classes() const { return output_shape_.depth(); } + + // Writes to the given file. Returns false in case of error. + // Should be overridden by subclasses, but called by their Serialize. + virtual bool Serialize(TFile* fp) const; + // Reads from the given file. Returns false in case of error. + // Should be overridden by subclasses, but NOT called by their DeSerialize. + virtual bool DeSerialize(TFile* fp); + + // Runs forward propagation of activations on the input line. + // See Network for a detailed discussion of the arguments. + virtual void Forward(bool debug, const NetworkIO& input, + const TransposedArray* input_transpose, + NetworkScratch* scratch, NetworkIO* output); + + private: + int InitFromProto(); + + // The original network definition for reference. + string spec_; + // Input tensor parameters. + StaticShape input_shape_; + // Output tensor parameters. + StaticShape output_shape_; + // The tensor flow graph is contained in here. + std::unique_ptr session_; + // The serialized graph is also contained in here. + TFNetworkModel model_proto_; +}; + +} // namespace tesseract. + +#endif // ifdef INCLUDE_TENSORFLOW + +#endif // TESSERACT_TENSORFLOW_TFNETWORK_H_ diff --git a/src/lstm/tfnetwork.proto b/src/lstm/tfnetwork.proto index 285b4bb308..0942fd2724 100644 --- a/src/lstm/tfnetwork.proto +++ b/src/lstm/tfnetwork.proto @@ -1,61 +1,61 @@ -syntax = "proto3"; - -package tesseract; - -// TODO(rays) How to make this usable both in Google and open source? -import "third_party/tensorflow/core/framework/graph.proto"; - -// This proto is the interface between a python TF graph builder/trainer and -// the C++ world. The writer of this proto must provide fields as documented -// by the comments below. -// The graph must have a placeholder for NetworkIO, Widths and Heights. The -// following python code creates the appropriate placeholders: -// -// input_layer = tf.placeholder(tf.float32, -// shape=[batch_size, xsize, ysize, depth_dim], -// name='NetworkIO') -// widths = tf.placeholder(tf.int32, shape=[batch_size], name='Widths') -// heights = tf.placeholder(tf.int32, shape=[batch_size], name='Heights') -// # Flip x and y to the TF convention. -// input_layer = tf.transpose(input_layer, [0, 2, 1, 3]) -// -// The widths and heights will be set to indicate the post-scaling size of the -// input image(s). -// For now batch_size is ignored and set to 1. -// The graph should return a 2-dimensional float32 tensor called 'softmax' of -// shape [sequence_length, num_classes], where sequence_length is allowed to -// be variable, given by the tensor itself. -// TODO(rays) determine whether it is worth providing for batch_size >1 and if -// so, how. -message TFNetworkModel { - // The TF graph definition. Required. - tensorflow.GraphDef graph = 1; - // The training index. Required to be > 0. - int64 global_step = 2; - // The original network definition for reference. Optional - string spec = 3; - // Input tensor parameters. - // Values per pixel. Required to be 1 or 3. Inputs assumed to be float32. - int32 depth = 4; - // Image size. Required. Zero implies flexible sizes, fixed if non-zero. - // If x_size > 0, images will be cropped/padded to the given size, after - // any scaling required by the y_size. - // If y_size > 0, images will be scaled isotropically to the given height. - int32 x_size = 5; - int32 y_size = 6; - // Number of images in a batch. Optional. - int32 batch_size = 8; - // Output tensor parameters. - // Number of output classes. Required to match the depth of the softmax. - int32 num_classes = 9; - // True if this network needs CTC-like decoding, dropping duplicated labels. - // The decoder always drops the null character. - bool using_ctc = 10; - // Name of input image tensor. - string image_input = 11; - // Name of image height and width tensors. - string image_widths = 12; - string image_heights = 13; - // Name of output (softmax) tensor. - string output_layer = 14; -} +syntax = "proto3"; + +package tesseract; + +// TODO(rays) How to make this usable both in Google and open source? +import "third_party/tensorflow/core/framework/graph.proto"; + +// This proto is the interface between a python TF graph builder/trainer and +// the C++ world. The writer of this proto must provide fields as documented +// by the comments below. +// The graph must have a placeholder for NetworkIO, Widths and Heights. The +// following python code creates the appropriate placeholders: +// +// input_layer = tf.placeholder(tf.float32, +// shape=[batch_size, xsize, ysize, depth_dim], +// name='NetworkIO') +// widths = tf.placeholder(tf.int32, shape=[batch_size], name='Widths') +// heights = tf.placeholder(tf.int32, shape=[batch_size], name='Heights') +// # Flip x and y to the TF convention. +// input_layer = tf.transpose(input_layer, [0, 2, 1, 3]) +// +// The widths and heights will be set to indicate the post-scaling size of the +// input image(s). +// For now batch_size is ignored and set to 1. +// The graph should return a 2-dimensional float32 tensor called 'softmax' of +// shape [sequence_length, num_classes], where sequence_length is allowed to +// be variable, given by the tensor itself. +// TODO(rays) determine whether it is worth providing for batch_size >1 and if +// so, how. +message TFNetworkModel { + // The TF graph definition. Required. + tensorflow.GraphDef graph = 1; + // The training index. Required to be > 0. + int64 global_step = 2; + // The original network definition for reference. Optional + string spec = 3; + // Input tensor parameters. + // Values per pixel. Required to be 1 or 3. Inputs assumed to be float32. + int32 depth = 4; + // Image size. Required. Zero implies flexible sizes, fixed if non-zero. + // If x_size > 0, images will be cropped/padded to the given size, after + // any scaling required by the y_size. + // If y_size > 0, images will be scaled isotropically to the given height. + int32 x_size = 5; + int32 y_size = 6; + // Number of images in a batch. Optional. + int32 batch_size = 8; + // Output tensor parameters. + // Number of output classes. Required to match the depth of the softmax. + int32 num_classes = 9; + // True if this network needs CTC-like decoding, dropping duplicated labels. + // The decoder always drops the null character. + bool using_ctc = 10; + // Name of input image tensor. + string image_input = 11; + // Name of image height and width tensors. + string image_widths = 12; + string image_heights = 13; + // Name of output (softmax) tensor. + string output_layer = 14; +} diff --git a/src/opencl/Makefile.am b/src/opencl/Makefile.am index 2674d5dcf0..d5bbd29a6f 100644 --- a/src/opencl/Makefile.am +++ b/src/opencl/Makefile.am @@ -1,8 +1,8 @@ -AM_CPPFLAGS += -I$(top_srcdir)/ccutil -I$(top_srcdir)/ccstruct -I$(top_srcdir)/ccmain $(OPENCL_CFLAGS) -noinst_HEADERS = \ - openclwrapper.h oclkernels.h opencl_device_selection.h - -noinst_LTLIBRARIES = libtesseract_opencl.la - -libtesseract_opencl_la_SOURCES = \ - openclwrapper.cpp +AM_CPPFLAGS += -I$(top_srcdir)/ccutil -I$(top_srcdir)/ccstruct -I$(top_srcdir)/ccmain $(OPENCL_CFLAGS) +noinst_HEADERS = \ + openclwrapper.h oclkernels.h opencl_device_selection.h + +noinst_LTLIBRARIES = libtesseract_opencl.la + +libtesseract_opencl_la_SOURCES = \ + openclwrapper.cpp diff --git a/src/opencl/oclkernels.h b/src/opencl/oclkernels.h index 51fd0938da..1788baa9f9 100644 --- a/src/opencl/oclkernels.h +++ b/src/opencl/oclkernels.h @@ -1,1073 +1,1073 @@ -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef TESSERACT_OPENCL_OCLKERNELS_H_ -#define TESSERACT_OPENCL_OCLKERNELS_H_ - -#ifndef USE_EXTERNAL_KERNEL -#define KERNEL( ... )# __VA_ARGS__ "\n" -// Double precision is a default of spreadsheets -// cl_khr_fp64: Khronos extension -// cl_amd_fp64: AMD extension -// use build option outside to define fp_t -///////////////////////////////////////////// -const char *kernel_src = KERNEL( -\n#ifdef KHR_DP_EXTENSION\n -\n#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n -\n#elif AMD_DP_EXTENSION\n -\n#pragma OPENCL EXTENSION cl_amd_fp64 : enable\n -\n#else\n -\n#endif\n -__kernel void composeRGBPixel(__global uint *tiffdata, int w, int h,int wpl, __global uint *output) -{ - int i = get_global_id(1); - int j = get_global_id(0); - int tiffword,rval,gval,bval; - - //Ignore the excess - if ((i >= h) || (j >= w)) - return; - - tiffword = tiffdata[i * w + j]; - rval = ((tiffword) & 0xff); - gval = (((tiffword) >> 8) & 0xff); - bval = (((tiffword) >> 16) & 0xff); - output[i*wpl+j] = (rval << (8 * (sizeof(uint) - 1 - 0))) | (gval << (8 * (sizeof(uint) - 1 - 1))) | (bval << (8 * (sizeof(uint) - 1 - 2))); -} -) - -KERNEL( -\n__kernel void pixSubtract_inplace(__global int *dword, __global int *sword, - const int wpl, const int h) -{ - const unsigned int row = get_global_id(1); - const unsigned int col = get_global_id(0); - const unsigned int pos = row * wpl + col; - - //Ignore the execss - if (row >= h || col >= wpl) - return; - - *(dword + pos) &= ~(*(sword + pos)); -}\n -) - -KERNEL( -\n__kernel void pixSubtract(__global int *dword, __global int *sword, - const int wpl, const int h, __global int *outword) -{ - const unsigned int row = get_global_id(1); - const unsigned int col = get_global_id(0); - const unsigned int pos = row * wpl + col; - - //Ignore the execss - if (row >= h || col >= wpl) - return; - - *(outword + pos) = *(dword + pos) & ~(*(sword + pos)); -}\n -) - -KERNEL( -\n__kernel void morphoDilateHor_5x5(__global int *sword,__global int *dword, - const int wpl, const int h) -{ - const unsigned int pos = get_global_id(0); - unsigned int prevword, nextword, currword,tempword; - unsigned int destword; - const int col = pos % wpl; - - //Ignore the execss - if (pos >= (wpl * h)) - return; - - - currword = *(sword + pos); - destword = currword; - - //Handle boundary conditions - if(col==0) - prevword=0; - else - prevword = *(sword + pos - 1); - - if(col==(wpl - 1)) - nextword=0; - else - nextword = *(sword + pos + 1); - - //Loop unrolled - - //1 bit to left and 1 bit to right - //Get the max value on LHS of every pixel - tempword = (prevword << (31)) | ((currword >> 1)); - destword |= tempword; - //Get max value on RHS of every pixel - tempword = (currword << 1) | (nextword >> (31)); - destword |= tempword; - - //2 bit to left and 2 bit to right - //Get the max value on LHS of every pixel - tempword = (prevword << (30)) | ((currword >> 2)); - destword |= tempword; - //Get max value on RHS of every pixel - tempword = (currword << 2) | (nextword >> (30)); - destword |= tempword; - - - *(dword + pos) = destword; - -}\n -) - -KERNEL( -\n__kernel void morphoDilateVer_5x5(__global int *sword,__global int *dword, - const int wpl, const int h) -{ - const int col = get_global_id(0); - const int row = get_global_id(1); - const unsigned int pos = row * wpl + col; - unsigned int tempword; - unsigned int destword; - int i; - - //Ignore the execss - if (row >= h || col >= wpl) - return; - - destword = *(sword + pos); - - //2 words above - i = (row - 2) < 0 ? row : (row - 2); - tempword = *(sword + i*wpl + col); - destword |= tempword; - - //1 word above - i = (row - 1) < 0 ? row : (row - 1); - tempword = *(sword + i*wpl + col); - destword |= tempword; - - //1 word below - i = (row >= (h - 1)) ? row : (row + 1); - tempword = *(sword + i*wpl + col); - destword |= tempword; - - //2 words below - i = (row >= (h - 2)) ? row : (row + 2); - tempword = *(sword + i*wpl + col); - destword |= tempword; - - *(dword + pos) = destword; -}\n -) - -KERNEL( -\n__kernel void morphoDilateHor(__global int *sword,__global int *dword,const int xp, const int xn, const int wpl, const int h) -{ - const int col = get_global_id(0); - const int row = get_global_id(1); - const unsigned int pos = row * wpl + col; - unsigned int parbitsxp, parbitsxn, nwords; - unsigned int destword, tempword, lastword, currword; - unsigned int lnextword, lprevword, rnextword, rprevword, firstword, secondword; - int i, j, siter, eiter; - - //Ignore the execss - if (pos >= (wpl*h) || (xn < 1 && xp < 1)) - return; - - currword = *(sword + pos); - destword = currword; - - parbitsxp = xp & 31; - parbitsxn = xn & 31; - nwords = xp >> 5; - - if (parbitsxp > 0) - nwords += 1; - else - parbitsxp = 31; - - siter = (col - nwords); - eiter = (col + nwords); - - //Get prev word - if (col==0) - firstword = 0x0; - else - firstword = *(sword + pos - 1); - - //Get next word - if (col == (wpl - 1)) - secondword = 0x0; - else - secondword = *(sword + pos + 1); - - //Last partial bits on either side - for (i = 1; i <= parbitsxp; i++) - { - //Get the max value on LHS of every pixel - tempword = ((i == parbitsxp) && (parbitsxp != parbitsxn)) ? 0x0 : (firstword << (32-i)) | ((currword >> i)); - - destword |= tempword; - - //Get max value on RHS of every pixel - tempword = (currword << i) | (secondword >> (32 - i)); - destword |= tempword; - } - - //Return if halfwidth <= 1 word - if (nwords == 1) - { - if (xn == 32) - { - destword |= firstword; - } - if (xp == 32) - { - destword |= secondword; - } - - *(dword + pos) = destword; - return; - } - - if (siter < 0) - firstword = 0x0; - else - firstword = *(sword + row*wpl + siter); - - if (eiter >= wpl) - lastword = 0x0; - else - lastword = *(sword + row*wpl + eiter); - - for ( i = 1; i < nwords; i++) - { - //Gets LHS words - if ((siter + i) < 0) - secondword = 0x0; - else - secondword = *(sword + row*wpl + siter + i); - - lprevword = firstword << (32 - parbitsxn) | secondword >> parbitsxn; - - firstword = secondword; - - if ((siter + i + 1) < 0) - secondword = 0x0; - else - secondword = *(sword + row*wpl + siter + i + 1); - - lnextword = firstword << (32 - parbitsxn) | secondword >> parbitsxn; - - //Gets RHS words - if ((eiter - i) >= wpl) - firstword = 0x0; - else - firstword = *(sword + row*wpl + eiter - i); - - rnextword = firstword << parbitsxp | lastword >> (32 - parbitsxp); - - lastword = firstword; - if ((eiter - i - 1) >= wpl) - firstword = 0x0; - else - firstword = *(sword + row*wpl + eiter - i - 1); - - rprevword = firstword << parbitsxp | lastword >> (32 - parbitsxp); - - for (j = 1; j < 32; j++) - { - //OR LHS full words - tempword = (lprevword << j) | (lnextword >> (32 - j)); - destword |= tempword; - - //OR RHS full words - tempword = (rprevword << j) | (rnextword >> (32 - j)); - destword |= tempword; - } - - destword |= lprevword; - destword |= lnextword; - destword |= rprevword; - destword |= rnextword; - - lastword = firstword; - firstword = secondword; - } - - *(dword + pos) = destword; -}\n -) - -KERNEL( -\n__kernel void morphoDilateHor_32word(__global int *sword,__global int *dword, - const int halfwidth, - const int wpl, const int h, - const char isEven) -{ - const int col = get_global_id(0); - const int row = get_global_id(1); - const unsigned int pos = row * wpl + col; - unsigned int prevword, nextword, currword,tempword; - unsigned int destword; - int i; - - //Ignore the execss - if (pos >= (wpl * h)) - return; - - currword = *(sword + pos); - destword = currword; - - //Handle boundary conditions - if(col==0) - prevword=0; - else - prevword = *(sword + pos - 1); - - if(col==(wpl - 1)) - nextword=0; - else - nextword = *(sword + pos + 1); - - for (i = 1; i <= halfwidth; i++) - { - //Get the max value on LHS of every pixel - if (i == halfwidth && isEven) - { - tempword = 0x0; - } - else - { - tempword = (prevword << (32-i)) | ((currword >> i)); - } - - destword |= tempword; - - //Get max value on RHS of every pixel - tempword = (currword << i) | (nextword >> (32 - i)); - - destword |= tempword; - } - - *(dword + pos) = destword; -}\n -) - -KERNEL( -\n__kernel void morphoDilateVer(__global int *sword,__global int *dword, - const int yp, - const int wpl, const int h, - const int yn) -{ - const int col = get_global_id(0); - const int row = get_global_id(1); - const unsigned int pos = row * wpl + col; - unsigned int tempword; - unsigned int destword; - int i, siter, eiter; - - //Ignore the execss - if (row >= h || col >= wpl) - return; - - destword = *(sword + pos); - - //Set start position and end position considering the boundary conditions - siter = (row - yn) < 0 ? 0 : (row - yn); - eiter = (row >= (h - yp)) ? (h - 1) : (row + yp); - - for (i = siter; i <= eiter; i++) - { - tempword = *(sword + i*wpl + col); - - destword |= tempword; - } - - *(dword + pos) = destword; -}\n -) - -KERNEL( -\n__kernel void morphoErodeHor_5x5(__global int *sword,__global int *dword, - const int wpl, const int h) -{ - const unsigned int pos = get_global_id(0); - unsigned int prevword, nextword, currword,tempword; - unsigned int destword; - const int col = pos % wpl; - - //Ignore the execss - if (pos >= (wpl * h)) - return; - - currword = *(sword + pos); - destword = currword; - - //Handle boundary conditions - if(col==0) - prevword=0xffffffff; - else - prevword = *(sword + pos - 1); - - if(col==(wpl - 1)) - nextword=0xffffffff; - else - nextword = *(sword + pos + 1); - - //Loop unrolled - - //1 bit to left and 1 bit to right - //Get the min value on LHS of every pixel - tempword = (prevword << (31)) | ((currword >> 1)); - destword &= tempword; - //Get min value on RHS of every pixel - tempword = (currword << 1) | (nextword >> (31)); - destword &= tempword; - - //2 bit to left and 2 bit to right - //Get the min value on LHS of every pixel - tempword = (prevword << (30)) | ((currword >> 2)); - destword &= tempword; - //Get min value on RHS of every pixel - tempword = (currword << 2) | (nextword >> (30)); - destword &= tempword; - - - *(dword + pos) = destword; - -}\n -) - -KERNEL( -\n__kernel void morphoErodeVer_5x5(__global int *sword,__global int *dword, - const int wpl, const int h, - const int fwmask, const int lwmask) -{ - const int col = get_global_id(0); - const int row = get_global_id(1); - const unsigned int pos = row * wpl + col; - unsigned int tempword; - unsigned int destword; - int i; - - //Ignore the execss - if (row >= h || col >= wpl) - return; - - destword = *(sword + pos); - - if (row < 2 || row >= (h - 2)) - { - destword = 0x0; - } - else - { - //2 words above - //i = (row - 2) < 0 ? row : (row - 2); - i = (row - 2); - tempword = *(sword + i*wpl + col); - destword &= tempword; - - //1 word above - //i = (row - 1) < 0 ? row : (row - 1); - i = (row - 1); - tempword = *(sword + i*wpl + col); - destword &= tempword; - - //1 word below - //i = (row >= (h - 1)) ? row : (row + 1); - i = (row + 1); - tempword = *(sword + i*wpl + col); - destword &= tempword; - - //2 words below - //i = (row >= (h - 2)) ? row : (row + 2); - i = (row + 2); - tempword = *(sword + i*wpl + col); - destword &= tempword; - - if (col == 0) - { - destword &= fwmask; - } - if (col == (wpl - 1)) - { - destword &= lwmask; - } - } - - - *(dword + pos) = destword; -}\n -) - -KERNEL( -\n__kernel void morphoErodeHor(__global int *sword,__global int *dword, const int xp, const int xn, const int wpl, - const int h, const char isAsymmetric, const int rwmask, const int lwmask) -{ - const int col = get_global_id(0); - const int row = get_global_id(1); - const unsigned int pos = row * wpl + col; - unsigned int parbitsxp, parbitsxn, nwords; - unsigned int destword, tempword, lastword, currword; - unsigned int lnextword, lprevword, rnextword, rprevword, firstword, secondword; - int i, j, siter, eiter; - - //Ignore the execss - if (pos >= (wpl*h) || (xn < 1 && xp < 1)) - return; - - currword = *(sword + pos); - destword = currword; - - parbitsxp = xp & 31; - parbitsxn = xn & 31; - nwords = xp >> 5; - - if (parbitsxp > 0) - nwords += 1; - else - parbitsxp = 31; - - siter = (col - nwords); - eiter = (col + nwords); - - //Get prev word - if (col==0) - firstword = 0xffffffff; - else - firstword = *(sword + pos - 1); - - //Get next word - if (col == (wpl - 1)) - secondword = 0xffffffff; - else - secondword = *(sword + pos + 1); - - //Last partial bits on either side - for (i = 1; i <= parbitsxp; i++) - { - //Get the max value on LHS of every pixel - tempword = (firstword << (32-i)) | ((currword >> i)); - destword &= tempword; - - //Get max value on RHS of every pixel - tempword = ((i == parbitsxp) && (parbitsxp != parbitsxn)) ? 0xffffffff : (currword << i) | (secondword >> (32 - i)); - - //tempword = (currword << i) | (secondword >> (32 - i)); - destword &= tempword; - } - - //Return if halfwidth <= 1 word - if (nwords == 1) - { - if (xp == 32) - { - destword &= firstword; - } - if (xn == 32) - { - destword &= secondword; - } - - //Clear boundary pixels - if (isAsymmetric) - { - if (col == 0) - destword &= rwmask; - if (col == (wpl - 1)) - destword &= lwmask; - } - - *(dword + pos) = destword; - return; - } - - if (siter < 0) - firstword = 0xffffffff; - else - firstword = *(sword + row*wpl + siter); - - if (eiter >= wpl) - lastword = 0xffffffff; - else - lastword = *(sword + row*wpl + eiter); - - - for ( i = 1; i < nwords; i++) - { - //Gets LHS words - if ((siter + i) < 0) - secondword = 0xffffffff; - else - secondword = *(sword + row*wpl + siter + i); - - lprevword = firstword << (32 - parbitsxp) | secondword >> (parbitsxp); - - firstword = secondword; - - if ((siter + i + 1) < 0) - secondword = 0xffffffff; - else - secondword = *(sword + row*wpl + siter + i + 1); - - lnextword = firstword << (32 - parbitsxp) | secondword >> (parbitsxp); - - //Gets RHS words - if ((eiter - i) >= wpl) - firstword = 0xffffffff; - else - firstword = *(sword + row*wpl + eiter - i); - - rnextword = firstword << parbitsxn | lastword >> (32 - parbitsxn); - - lastword = firstword; - if ((eiter - i - 1) >= wpl) - firstword = 0xffffffff; - else - firstword = *(sword + row*wpl + eiter - i - 1); - - rprevword = firstword << parbitsxn | lastword >> (32 - parbitsxn); - - for (j = 0; j < 32; j++) - { - //OR LHS full words - tempword = (lprevword << j) | (lnextword >> (32 - j)); - destword &= tempword; - - //OR RHS full words - tempword = (rprevword << j) | (rnextword >> (32 - j)); - destword &= tempword; - } - - destword &= lprevword; - destword &= lnextword; - destword &= rprevword; - destword &= rnextword; - - lastword = firstword; - firstword = secondword; - } - - if (isAsymmetric) - { - //Clear boundary pixels - if (col < (nwords - 1)) - destword = 0x0; - else if (col == (nwords - 1)) - destword &= rwmask; - else if (col > (wpl - nwords)) - destword = 0x0; - else if (col == (wpl - nwords)) - destword &= lwmask; - } - - *(dword + pos) = destword; -}\n -) - -KERNEL( -\n__kernel void morphoErodeHor_32word(__global int *sword,__global int *dword, - const int halfwidth, const int wpl, - const int h, const char clearBoundPixH, - const int rwmask, const int lwmask, - const char isEven) -{ - const int col = get_global_id(0); - const int row = get_global_id(1); - const unsigned int pos = row * wpl + col; - unsigned int prevword, nextword, currword,tempword, destword; - int i; - - //Ignore the execss - if (pos >= (wpl * h)) - return; - - currword = *(sword + pos); - destword = currword; - - //Handle boundary conditions - if(col==0) - prevword=0xffffffff; - else - prevword = *(sword + pos - 1); - - if(col==(wpl - 1)) - nextword=0xffffffff; - else - nextword = *(sword + pos + 1); - - for (i = 1; i <= halfwidth; i++) - { - //Get the min value on LHS of every pixel - tempword = (prevword << (32-i)) | ((currword >> i)); - - destword &= tempword; - - //Get min value on RHS of every pixel - if (i == halfwidth && isEven) - { - tempword = 0xffffffff; - } - else - { - tempword = (currword << i) | (nextword >> (32 - i)); - } - - destword &= tempword; - } - - if (clearBoundPixH) - { - if (col == 0) - { - destword &= rwmask; - } - else if (col == (wpl - 1)) - { - destword &= lwmask; - } - } - - *(dword + pos) = destword; -}\n -) - -KERNEL( -\n__kernel void morphoErodeVer(__global int *sword,__global int *dword, - const int yp, - const int wpl, const int h, - const char clearBoundPixV, const int yn) -{ - const int col = get_global_id(0); - const int row = get_global_id(1); - const unsigned int pos = row * wpl + col; - unsigned int tempword, destword; - int i, siter, eiter; - - //Ignore the execss - if (row >= h || col >= wpl) - return; - - destword = *(sword + pos); - - //Set start position and end position considering the boundary conditions - siter = (row - yp) < 0 ? 0 : (row - yp); - eiter = (row >= (h - yn)) ? (h - 1) : (row + yn); - - for (i = siter; i <= eiter; i++) - { - tempword = *(sword + i*wpl + col); - - destword &= tempword; - } - - //Clear boundary pixels - if (clearBoundPixV && ((row < yp) || ((h - row) <= yn))) - { - destword = 0x0; - } - - *(dword + pos) = destword; -}\n -) - -// HistogramRect Kernel: Accumulate -// assumes 4 channels, i.e., bytes_per_pixel = 4 -// assumes number of pixels is multiple of 8 -// data is laid out as -// ch0 ch1 ... -// bin0 bin1 bin2... bin0... -// rpt0,1,2...256 rpt0,1,2... -KERNEL( -\n#define HIST_REDUNDANCY 256\n -\n#define GROUP_SIZE 256\n -\n#define HIST_SIZE 256\n -\n#define NUM_CHANNELS 4\n -\n#define HR_UNROLL_SIZE 8 \n -\n#define HR_UNROLL_TYPE uchar8 \n - -__attribute__((reqd_work_group_size(256, 1, 1))) -__kernel -void kernel_HistogramRectAllChannels( - __global const uchar8 *data, - uint numPixels, - __global uint *histBuffer) { - - // declare variables - uchar8 pixels; - int threadOffset = get_global_id(0)%HIST_REDUNDANCY; - - // for each pixel/channel, accumulate in global memory - for ( uint pc = get_global_id(0); pc < numPixels*NUM_CHANNELS/HR_UNROLL_SIZE; pc += get_global_size(0) ) { - pixels = data[pc]; - // channel bin thread - atomic_inc( &histBuffer[ 0*HIST_SIZE*HIST_REDUNDANCY + pixels.s0*HIST_REDUNDANCY + threadOffset ]); // ch0 - atomic_inc( &histBuffer[ 0*HIST_SIZE*HIST_REDUNDANCY + pixels.s4*HIST_REDUNDANCY + threadOffset ]); // ch0 - atomic_inc( &histBuffer[ 1*HIST_SIZE*HIST_REDUNDANCY + pixels.s1*HIST_REDUNDANCY + threadOffset ]); // ch1 - atomic_inc( &histBuffer[ 1*HIST_SIZE*HIST_REDUNDANCY + pixels.s5*HIST_REDUNDANCY + threadOffset ]); // ch1 - atomic_inc( &histBuffer[ 2*HIST_SIZE*HIST_REDUNDANCY + pixels.s2*HIST_REDUNDANCY + threadOffset ]); // ch2 - atomic_inc( &histBuffer[ 2*HIST_SIZE*HIST_REDUNDANCY + pixels.s6*HIST_REDUNDANCY + threadOffset ]); // ch2 - atomic_inc( &histBuffer[ 3*HIST_SIZE*HIST_REDUNDANCY + pixels.s3*HIST_REDUNDANCY + threadOffset ]); // ch3 - atomic_inc( &histBuffer[ 3*HIST_SIZE*HIST_REDUNDANCY + pixels.s7*HIST_REDUNDANCY + threadOffset ]); // ch3 - } -} -) - -KERNEL( -// NUM_CHANNELS = 1 -__attribute__((reqd_work_group_size(256, 1, 1))) -__kernel -void kernel_HistogramRectOneChannel( - __global const uchar8 *data, - uint numPixels, - __global uint *histBuffer) { - - // declare variables - uchar8 pixels; - int threadOffset = get_global_id(0)%HIST_REDUNDANCY; - - // for each pixel/channel, accumulate in global memory - for ( uint pc = get_global_id(0); pc < numPixels/HR_UNROLL_SIZE; pc += get_global_size(0) ) { - pixels = data[pc]; - // bin thread - atomic_inc( &histBuffer[ pixels.s0*HIST_REDUNDANCY + threadOffset ]); - atomic_inc( &histBuffer[ pixels.s1*HIST_REDUNDANCY + threadOffset ]); - atomic_inc( &histBuffer[ pixels.s2*HIST_REDUNDANCY + threadOffset ]); - atomic_inc( &histBuffer[ pixels.s3*HIST_REDUNDANCY + threadOffset ]); - atomic_inc( &histBuffer[ pixels.s4*HIST_REDUNDANCY + threadOffset ]); - atomic_inc( &histBuffer[ pixels.s5*HIST_REDUNDANCY + threadOffset ]); - atomic_inc( &histBuffer[ pixels.s6*HIST_REDUNDANCY + threadOffset ]); - atomic_inc( &histBuffer[ pixels.s7*HIST_REDUNDANCY + threadOffset ]); - } -} -) - -// HistogramRect Kernel: Reduction -// only supports 4 channels -// each work group handles a single channel of a single histogram bin -KERNEL( -__attribute__((reqd_work_group_size(256, 1, 1))) -__kernel -void kernel_HistogramRectAllChannelsReduction( - int n, // unused pixel redundancy - __global uint *histBuffer, - __global int* histResult) { - - // declare variables - int channel = get_group_id(0)/HIST_SIZE; - int bin = get_group_id(0)%HIST_SIZE; - int value = 0; - - // accumulate in register - for ( uint i = get_local_id(0); i < HIST_REDUNDANCY; i+=GROUP_SIZE) { - value += histBuffer[ channel*HIST_SIZE*HIST_REDUNDANCY+bin*HIST_REDUNDANCY+i]; - } - - // reduction in local memory - __local int localHist[GROUP_SIZE]; - localHist[get_local_id(0)] = value; - barrier(CLK_LOCAL_MEM_FENCE); - for (int stride = GROUP_SIZE/2; stride >= 1; stride /= 2) { - if (get_local_id(0) < stride) { - value = localHist[ get_local_id(0)+stride]; - } - barrier(CLK_LOCAL_MEM_FENCE); - if (get_local_id(0) < stride) { - localHist[ get_local_id(0)] += value; - } - barrier(CLK_LOCAL_MEM_FENCE); - } - - // write reduction to final result - if (get_local_id(0) == 0) { - histResult[get_group_id(0)] = localHist[0]; - } -} // kernel_HistogramRectAllChannels -) - - -KERNEL( -// NUM_CHANNELS = 1 -__attribute__((reqd_work_group_size(256, 1, 1))) -__kernel -void kernel_HistogramRectOneChannelReduction( - int n, // unused pixel redundancy - __global uint *histBuffer, - __global int* histResult) { - - // declare variables - // int channel = get_group_id(0)/HIST_SIZE; - int bin = get_group_id(0)%HIST_SIZE; - int value = 0; - - // accumulate in register - for ( int i = get_local_id(0); i < HIST_REDUNDANCY; i+=GROUP_SIZE) { - value += histBuffer[ bin*HIST_REDUNDANCY+i]; - } - - // reduction in local memory - __local int localHist[GROUP_SIZE]; - localHist[get_local_id(0)] = value; - barrier(CLK_LOCAL_MEM_FENCE); - for (int stride = GROUP_SIZE/2; stride >= 1; stride /= 2) { - if (get_local_id(0) < stride) { - value = localHist[ get_local_id(0)+stride]; - } - barrier(CLK_LOCAL_MEM_FENCE); - if (get_local_id(0) < stride) { - localHist[ get_local_id(0)] += value; - } - barrier(CLK_LOCAL_MEM_FENCE); - } - - // write reduction to final result - if (get_local_id(0) == 0) { - histResult[get_group_id(0)] = localHist[0]; - } -} // kernel_HistogramRectOneChannelReduction -) - -// ThresholdRectToPix Kernel -// only supports 4 channels -// imageData is input image (24-bits/pixel) -// pix is output image (1-bit/pixel) -KERNEL( -\n#define CHAR_VEC_WIDTH 4 \n -\n#define PIXELS_PER_WORD 32 \n -\n#define PIXELS_PER_BURST 8 \n -\n#define BURSTS_PER_WORD (PIXELS_PER_WORD/PIXELS_PER_BURST) \n - typedef union { - uchar s[PIXELS_PER_BURST*NUM_CHANNELS]; - uchar4 v[(PIXELS_PER_BURST*NUM_CHANNELS)/CHAR_VEC_WIDTH]; - } charVec; - -__attribute__((reqd_work_group_size(256, 1, 1))) -__kernel -void kernel_ThresholdRectToPix( - __global const uchar4 *imageData, - int height, - int width, - int wpl, // words per line - __global int *thresholds, - __global int *hi_values, - __global int *pix) { - - // declare variables - int pThresholds[NUM_CHANNELS]; - int pHi_Values[NUM_CHANNELS]; - for ( int i = 0; i < NUM_CHANNELS; i++) { - pThresholds[i] = thresholds[i]; - pHi_Values[i] = hi_values[i]; - } - - // for each word (32 pixels) in output image - for ( uint w = get_global_id(0); w < wpl*height; w += get_global_size(0) ) { - unsigned int word = 0; // all bits start at zero - // for each burst in word - for ( int b = 0; b < BURSTS_PER_WORD; b++) { - // load burst - charVec pixels; - int offset = (w / wpl) * width; - offset += (w % wpl) * PIXELS_PER_WORD; - offset += b * PIXELS_PER_BURST; - - for (int i = 0; i < PIXELS_PER_BURST; ++i) - pixels.v[i] = imageData[offset + i]; - - // for each pixel in burst - for ( int p = 0; p < PIXELS_PER_BURST; p++) { - for ( int c = 0; c < NUM_CHANNELS; c++) { - unsigned char pixChan = pixels.s[p*NUM_CHANNELS + c]; - if (pHi_Values[c] >= 0 && (pixChan > pThresholds[c]) == (pHi_Values[c] == 0)) { - const uint kTopBit = 0x80000000; - word |= (kTopBit >> ((b*PIXELS_PER_BURST+p)&31)); - } - } - } - } - pix[w] = word; - } -} - -\n#define CHAR_VEC_WIDTH 8 \n -\n#define PIXELS_PER_WORD 32 \n -\n#define PIXELS_PER_BURST 8 \n -\n#define BURSTS_PER_WORD (PIXELS_PER_WORD/PIXELS_PER_BURST) \n - typedef union { - uchar s[PIXELS_PER_BURST*1]; - uchar8 v[(PIXELS_PER_BURST*1)/CHAR_VEC_WIDTH]; - } charVec1; - -__attribute__((reqd_work_group_size(256, 1, 1))) -__kernel -void kernel_ThresholdRectToPix_OneChan( - __global const uchar8 *imageData, - int height, - int width, - int wpl, // words per line of output image - __global int *thresholds, - __global int *hi_values, - __global int *pix) { - - // declare variables - int pThresholds[1]; - int pHi_Values[1]; - for ( int i = 0; i < 1; i++) { - pThresholds[i] = thresholds[i]; - pHi_Values[i] = hi_values[i]; - } - - // for each word (32 pixels) in output image - for ( uint w = get_global_id(0); w < wpl*height; w += get_global_size(0) ) { - unsigned int word = 0; // all bits start at zero - - // for each burst in word - for ( int b = 0; b < BURSTS_PER_WORD; b++) { - - // load burst - charVec1 pixels; - // for each char8 in burst - pixels.v[0] = imageData[ - w*BURSTS_PER_WORD - + b - + 0 ]; - - // for each pixel in burst - for ( int p = 0; p < PIXELS_PER_BURST; p++) { - - //int littleEndianIdx = p ^ 3; - //int bigEndianIdx = p; - int idx = -\n#ifdef __ENDIAN_LITTLE__\n - p ^ 3; -\n#else\n - p; -\n#endif\n - unsigned char pixChan = pixels.s[idx]; - if (pHi_Values[0] >= 0 && (pixChan > pThresholds[0]) == (pHi_Values[0] == 0)) { - const uint kTopBit = 0x80000000; - word |= (kTopBit >> ((b*PIXELS_PER_BURST+p)&31)); - } - } - } - pix[w] = word; - } -} -) - - ; // close char* - -#endif // USE_EXTERNAL_KERNEL -#endif // TESSERACT_OPENCL_OCLKERNELS_H_ -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef TESSERACT_OPENCL_OCLKERNELS_H_ +#define TESSERACT_OPENCL_OCLKERNELS_H_ + +#ifndef USE_EXTERNAL_KERNEL +#define KERNEL( ... )# __VA_ARGS__ "\n" +// Double precision is a default of spreadsheets +// cl_khr_fp64: Khronos extension +// cl_amd_fp64: AMD extension +// use build option outside to define fp_t +///////////////////////////////////////////// +const char *kernel_src = KERNEL( +\n#ifdef KHR_DP_EXTENSION\n +\n#pragma OPENCL EXTENSION cl_khr_fp64 : enable\n +\n#elif AMD_DP_EXTENSION\n +\n#pragma OPENCL EXTENSION cl_amd_fp64 : enable\n +\n#else\n +\n#endif\n +__kernel void composeRGBPixel(__global uint *tiffdata, int w, int h,int wpl, __global uint *output) +{ + int i = get_global_id(1); + int j = get_global_id(0); + int tiffword,rval,gval,bval; + + //Ignore the excess + if ((i >= h) || (j >= w)) + return; + + tiffword = tiffdata[i * w + j]; + rval = ((tiffword) & 0xff); + gval = (((tiffword) >> 8) & 0xff); + bval = (((tiffword) >> 16) & 0xff); + output[i*wpl+j] = (rval << (8 * (sizeof(uint) - 1 - 0))) | (gval << (8 * (sizeof(uint) - 1 - 1))) | (bval << (8 * (sizeof(uint) - 1 - 2))); +} +) + +KERNEL( +\n__kernel void pixSubtract_inplace(__global int *dword, __global int *sword, + const int wpl, const int h) +{ + const unsigned int row = get_global_id(1); + const unsigned int col = get_global_id(0); + const unsigned int pos = row * wpl + col; + + //Ignore the execss + if (row >= h || col >= wpl) + return; + + *(dword + pos) &= ~(*(sword + pos)); +}\n +) + +KERNEL( +\n__kernel void pixSubtract(__global int *dword, __global int *sword, + const int wpl, const int h, __global int *outword) +{ + const unsigned int row = get_global_id(1); + const unsigned int col = get_global_id(0); + const unsigned int pos = row * wpl + col; + + //Ignore the execss + if (row >= h || col >= wpl) + return; + + *(outword + pos) = *(dword + pos) & ~(*(sword + pos)); +}\n +) + +KERNEL( +\n__kernel void morphoDilateHor_5x5(__global int *sword,__global int *dword, + const int wpl, const int h) +{ + const unsigned int pos = get_global_id(0); + unsigned int prevword, nextword, currword,tempword; + unsigned int destword; + const int col = pos % wpl; + + //Ignore the execss + if (pos >= (wpl * h)) + return; + + + currword = *(sword + pos); + destword = currword; + + //Handle boundary conditions + if(col==0) + prevword=0; + else + prevword = *(sword + pos - 1); + + if(col==(wpl - 1)) + nextword=0; + else + nextword = *(sword + pos + 1); + + //Loop unrolled + + //1 bit to left and 1 bit to right + //Get the max value on LHS of every pixel + tempword = (prevword << (31)) | ((currword >> 1)); + destword |= tempword; + //Get max value on RHS of every pixel + tempword = (currword << 1) | (nextword >> (31)); + destword |= tempword; + + //2 bit to left and 2 bit to right + //Get the max value on LHS of every pixel + tempword = (prevword << (30)) | ((currword >> 2)); + destword |= tempword; + //Get max value on RHS of every pixel + tempword = (currword << 2) | (nextword >> (30)); + destword |= tempword; + + + *(dword + pos) = destword; + +}\n +) + +KERNEL( +\n__kernel void morphoDilateVer_5x5(__global int *sword,__global int *dword, + const int wpl, const int h) +{ + const int col = get_global_id(0); + const int row = get_global_id(1); + const unsigned int pos = row * wpl + col; + unsigned int tempword; + unsigned int destword; + int i; + + //Ignore the execss + if (row >= h || col >= wpl) + return; + + destword = *(sword + pos); + + //2 words above + i = (row - 2) < 0 ? row : (row - 2); + tempword = *(sword + i*wpl + col); + destword |= tempword; + + //1 word above + i = (row - 1) < 0 ? row : (row - 1); + tempword = *(sword + i*wpl + col); + destword |= tempword; + + //1 word below + i = (row >= (h - 1)) ? row : (row + 1); + tempword = *(sword + i*wpl + col); + destword |= tempword; + + //2 words below + i = (row >= (h - 2)) ? row : (row + 2); + tempword = *(sword + i*wpl + col); + destword |= tempword; + + *(dword + pos) = destword; +}\n +) + +KERNEL( +\n__kernel void morphoDilateHor(__global int *sword,__global int *dword,const int xp, const int xn, const int wpl, const int h) +{ + const int col = get_global_id(0); + const int row = get_global_id(1); + const unsigned int pos = row * wpl + col; + unsigned int parbitsxp, parbitsxn, nwords; + unsigned int destword, tempword, lastword, currword; + unsigned int lnextword, lprevword, rnextword, rprevword, firstword, secondword; + int i, j, siter, eiter; + + //Ignore the execss + if (pos >= (wpl*h) || (xn < 1 && xp < 1)) + return; + + currword = *(sword + pos); + destword = currword; + + parbitsxp = xp & 31; + parbitsxn = xn & 31; + nwords = xp >> 5; + + if (parbitsxp > 0) + nwords += 1; + else + parbitsxp = 31; + + siter = (col - nwords); + eiter = (col + nwords); + + //Get prev word + if (col==0) + firstword = 0x0; + else + firstword = *(sword + pos - 1); + + //Get next word + if (col == (wpl - 1)) + secondword = 0x0; + else + secondword = *(sword + pos + 1); + + //Last partial bits on either side + for (i = 1; i <= parbitsxp; i++) + { + //Get the max value on LHS of every pixel + tempword = ((i == parbitsxp) && (parbitsxp != parbitsxn)) ? 0x0 : (firstword << (32-i)) | ((currword >> i)); + + destword |= tempword; + + //Get max value on RHS of every pixel + tempword = (currword << i) | (secondword >> (32 - i)); + destword |= tempword; + } + + //Return if halfwidth <= 1 word + if (nwords == 1) + { + if (xn == 32) + { + destword |= firstword; + } + if (xp == 32) + { + destword |= secondword; + } + + *(dword + pos) = destword; + return; + } + + if (siter < 0) + firstword = 0x0; + else + firstword = *(sword + row*wpl + siter); + + if (eiter >= wpl) + lastword = 0x0; + else + lastword = *(sword + row*wpl + eiter); + + for ( i = 1; i < nwords; i++) + { + //Gets LHS words + if ((siter + i) < 0) + secondword = 0x0; + else + secondword = *(sword + row*wpl + siter + i); + + lprevword = firstword << (32 - parbitsxn) | secondword >> parbitsxn; + + firstword = secondword; + + if ((siter + i + 1) < 0) + secondword = 0x0; + else + secondword = *(sword + row*wpl + siter + i + 1); + + lnextword = firstword << (32 - parbitsxn) | secondword >> parbitsxn; + + //Gets RHS words + if ((eiter - i) >= wpl) + firstword = 0x0; + else + firstword = *(sword + row*wpl + eiter - i); + + rnextword = firstword << parbitsxp | lastword >> (32 - parbitsxp); + + lastword = firstword; + if ((eiter - i - 1) >= wpl) + firstword = 0x0; + else + firstword = *(sword + row*wpl + eiter - i - 1); + + rprevword = firstword << parbitsxp | lastword >> (32 - parbitsxp); + + for (j = 1; j < 32; j++) + { + //OR LHS full words + tempword = (lprevword << j) | (lnextword >> (32 - j)); + destword |= tempword; + + //OR RHS full words + tempword = (rprevword << j) | (rnextword >> (32 - j)); + destword |= tempword; + } + + destword |= lprevword; + destword |= lnextword; + destword |= rprevword; + destword |= rnextword; + + lastword = firstword; + firstword = secondword; + } + + *(dword + pos) = destword; +}\n +) + +KERNEL( +\n__kernel void morphoDilateHor_32word(__global int *sword,__global int *dword, + const int halfwidth, + const int wpl, const int h, + const char isEven) +{ + const int col = get_global_id(0); + const int row = get_global_id(1); + const unsigned int pos = row * wpl + col; + unsigned int prevword, nextword, currword,tempword; + unsigned int destword; + int i; + + //Ignore the execss + if (pos >= (wpl * h)) + return; + + currword = *(sword + pos); + destword = currword; + + //Handle boundary conditions + if(col==0) + prevword=0; + else + prevword = *(sword + pos - 1); + + if(col==(wpl - 1)) + nextword=0; + else + nextword = *(sword + pos + 1); + + for (i = 1; i <= halfwidth; i++) + { + //Get the max value on LHS of every pixel + if (i == halfwidth && isEven) + { + tempword = 0x0; + } + else + { + tempword = (prevword << (32-i)) | ((currword >> i)); + } + + destword |= tempword; + + //Get max value on RHS of every pixel + tempword = (currword << i) | (nextword >> (32 - i)); + + destword |= tempword; + } + + *(dword + pos) = destword; +}\n +) + +KERNEL( +\n__kernel void morphoDilateVer(__global int *sword,__global int *dword, + const int yp, + const int wpl, const int h, + const int yn) +{ + const int col = get_global_id(0); + const int row = get_global_id(1); + const unsigned int pos = row * wpl + col; + unsigned int tempword; + unsigned int destword; + int i, siter, eiter; + + //Ignore the execss + if (row >= h || col >= wpl) + return; + + destword = *(sword + pos); + + //Set start position and end position considering the boundary conditions + siter = (row - yn) < 0 ? 0 : (row - yn); + eiter = (row >= (h - yp)) ? (h - 1) : (row + yp); + + for (i = siter; i <= eiter; i++) + { + tempword = *(sword + i*wpl + col); + + destword |= tempword; + } + + *(dword + pos) = destword; +}\n +) + +KERNEL( +\n__kernel void morphoErodeHor_5x5(__global int *sword,__global int *dword, + const int wpl, const int h) +{ + const unsigned int pos = get_global_id(0); + unsigned int prevword, nextword, currword,tempword; + unsigned int destword; + const int col = pos % wpl; + + //Ignore the execss + if (pos >= (wpl * h)) + return; + + currword = *(sword + pos); + destword = currword; + + //Handle boundary conditions + if(col==0) + prevword=0xffffffff; + else + prevword = *(sword + pos - 1); + + if(col==(wpl - 1)) + nextword=0xffffffff; + else + nextword = *(sword + pos + 1); + + //Loop unrolled + + //1 bit to left and 1 bit to right + //Get the min value on LHS of every pixel + tempword = (prevword << (31)) | ((currword >> 1)); + destword &= tempword; + //Get min value on RHS of every pixel + tempword = (currword << 1) | (nextword >> (31)); + destword &= tempword; + + //2 bit to left and 2 bit to right + //Get the min value on LHS of every pixel + tempword = (prevword << (30)) | ((currword >> 2)); + destword &= tempword; + //Get min value on RHS of every pixel + tempword = (currword << 2) | (nextword >> (30)); + destword &= tempword; + + + *(dword + pos) = destword; + +}\n +) + +KERNEL( +\n__kernel void morphoErodeVer_5x5(__global int *sword,__global int *dword, + const int wpl, const int h, + const int fwmask, const int lwmask) +{ + const int col = get_global_id(0); + const int row = get_global_id(1); + const unsigned int pos = row * wpl + col; + unsigned int tempword; + unsigned int destword; + int i; + + //Ignore the execss + if (row >= h || col >= wpl) + return; + + destword = *(sword + pos); + + if (row < 2 || row >= (h - 2)) + { + destword = 0x0; + } + else + { + //2 words above + //i = (row - 2) < 0 ? row : (row - 2); + i = (row - 2); + tempword = *(sword + i*wpl + col); + destword &= tempword; + + //1 word above + //i = (row - 1) < 0 ? row : (row - 1); + i = (row - 1); + tempword = *(sword + i*wpl + col); + destword &= tempword; + + //1 word below + //i = (row >= (h - 1)) ? row : (row + 1); + i = (row + 1); + tempword = *(sword + i*wpl + col); + destword &= tempword; + + //2 words below + //i = (row >= (h - 2)) ? row : (row + 2); + i = (row + 2); + tempword = *(sword + i*wpl + col); + destword &= tempword; + + if (col == 0) + { + destword &= fwmask; + } + if (col == (wpl - 1)) + { + destword &= lwmask; + } + } + + + *(dword + pos) = destword; +}\n +) + +KERNEL( +\n__kernel void morphoErodeHor(__global int *sword,__global int *dword, const int xp, const int xn, const int wpl, + const int h, const char isAsymmetric, const int rwmask, const int lwmask) +{ + const int col = get_global_id(0); + const int row = get_global_id(1); + const unsigned int pos = row * wpl + col; + unsigned int parbitsxp, parbitsxn, nwords; + unsigned int destword, tempword, lastword, currword; + unsigned int lnextword, lprevword, rnextword, rprevword, firstword, secondword; + int i, j, siter, eiter; + + //Ignore the execss + if (pos >= (wpl*h) || (xn < 1 && xp < 1)) + return; + + currword = *(sword + pos); + destword = currword; + + parbitsxp = xp & 31; + parbitsxn = xn & 31; + nwords = xp >> 5; + + if (parbitsxp > 0) + nwords += 1; + else + parbitsxp = 31; + + siter = (col - nwords); + eiter = (col + nwords); + + //Get prev word + if (col==0) + firstword = 0xffffffff; + else + firstword = *(sword + pos - 1); + + //Get next word + if (col == (wpl - 1)) + secondword = 0xffffffff; + else + secondword = *(sword + pos + 1); + + //Last partial bits on either side + for (i = 1; i <= parbitsxp; i++) + { + //Get the max value on LHS of every pixel + tempword = (firstword << (32-i)) | ((currword >> i)); + destword &= tempword; + + //Get max value on RHS of every pixel + tempword = ((i == parbitsxp) && (parbitsxp != parbitsxn)) ? 0xffffffff : (currword << i) | (secondword >> (32 - i)); + + //tempword = (currword << i) | (secondword >> (32 - i)); + destword &= tempword; + } + + //Return if halfwidth <= 1 word + if (nwords == 1) + { + if (xp == 32) + { + destword &= firstword; + } + if (xn == 32) + { + destword &= secondword; + } + + //Clear boundary pixels + if (isAsymmetric) + { + if (col == 0) + destword &= rwmask; + if (col == (wpl - 1)) + destword &= lwmask; + } + + *(dword + pos) = destword; + return; + } + + if (siter < 0) + firstword = 0xffffffff; + else + firstword = *(sword + row*wpl + siter); + + if (eiter >= wpl) + lastword = 0xffffffff; + else + lastword = *(sword + row*wpl + eiter); + + + for ( i = 1; i < nwords; i++) + { + //Gets LHS words + if ((siter + i) < 0) + secondword = 0xffffffff; + else + secondword = *(sword + row*wpl + siter + i); + + lprevword = firstword << (32 - parbitsxp) | secondword >> (parbitsxp); + + firstword = secondword; + + if ((siter + i + 1) < 0) + secondword = 0xffffffff; + else + secondword = *(sword + row*wpl + siter + i + 1); + + lnextword = firstword << (32 - parbitsxp) | secondword >> (parbitsxp); + + //Gets RHS words + if ((eiter - i) >= wpl) + firstword = 0xffffffff; + else + firstword = *(sword + row*wpl + eiter - i); + + rnextword = firstword << parbitsxn | lastword >> (32 - parbitsxn); + + lastword = firstword; + if ((eiter - i - 1) >= wpl) + firstword = 0xffffffff; + else + firstword = *(sword + row*wpl + eiter - i - 1); + + rprevword = firstword << parbitsxn | lastword >> (32 - parbitsxn); + + for (j = 0; j < 32; j++) + { + //OR LHS full words + tempword = (lprevword << j) | (lnextword >> (32 - j)); + destword &= tempword; + + //OR RHS full words + tempword = (rprevword << j) | (rnextword >> (32 - j)); + destword &= tempword; + } + + destword &= lprevword; + destword &= lnextword; + destword &= rprevword; + destword &= rnextword; + + lastword = firstword; + firstword = secondword; + } + + if (isAsymmetric) + { + //Clear boundary pixels + if (col < (nwords - 1)) + destword = 0x0; + else if (col == (nwords - 1)) + destword &= rwmask; + else if (col > (wpl - nwords)) + destword = 0x0; + else if (col == (wpl - nwords)) + destword &= lwmask; + } + + *(dword + pos) = destword; +}\n +) + +KERNEL( +\n__kernel void morphoErodeHor_32word(__global int *sword,__global int *dword, + const int halfwidth, const int wpl, + const int h, const char clearBoundPixH, + const int rwmask, const int lwmask, + const char isEven) +{ + const int col = get_global_id(0); + const int row = get_global_id(1); + const unsigned int pos = row * wpl + col; + unsigned int prevword, nextword, currword,tempword, destword; + int i; + + //Ignore the execss + if (pos >= (wpl * h)) + return; + + currword = *(sword + pos); + destword = currword; + + //Handle boundary conditions + if(col==0) + prevword=0xffffffff; + else + prevword = *(sword + pos - 1); + + if(col==(wpl - 1)) + nextword=0xffffffff; + else + nextword = *(sword + pos + 1); + + for (i = 1; i <= halfwidth; i++) + { + //Get the min value on LHS of every pixel + tempword = (prevword << (32-i)) | ((currword >> i)); + + destword &= tempword; + + //Get min value on RHS of every pixel + if (i == halfwidth && isEven) + { + tempword = 0xffffffff; + } + else + { + tempword = (currword << i) | (nextword >> (32 - i)); + } + + destword &= tempword; + } + + if (clearBoundPixH) + { + if (col == 0) + { + destword &= rwmask; + } + else if (col == (wpl - 1)) + { + destword &= lwmask; + } + } + + *(dword + pos) = destword; +}\n +) + +KERNEL( +\n__kernel void morphoErodeVer(__global int *sword,__global int *dword, + const int yp, + const int wpl, const int h, + const char clearBoundPixV, const int yn) +{ + const int col = get_global_id(0); + const int row = get_global_id(1); + const unsigned int pos = row * wpl + col; + unsigned int tempword, destword; + int i, siter, eiter; + + //Ignore the execss + if (row >= h || col >= wpl) + return; + + destword = *(sword + pos); + + //Set start position and end position considering the boundary conditions + siter = (row - yp) < 0 ? 0 : (row - yp); + eiter = (row >= (h - yn)) ? (h - 1) : (row + yn); + + for (i = siter; i <= eiter; i++) + { + tempword = *(sword + i*wpl + col); + + destword &= tempword; + } + + //Clear boundary pixels + if (clearBoundPixV && ((row < yp) || ((h - row) <= yn))) + { + destword = 0x0; + } + + *(dword + pos) = destword; +}\n +) + +// HistogramRect Kernel: Accumulate +// assumes 4 channels, i.e., bytes_per_pixel = 4 +// assumes number of pixels is multiple of 8 +// data is laid out as +// ch0 ch1 ... +// bin0 bin1 bin2... bin0... +// rpt0,1,2...256 rpt0,1,2... +KERNEL( +\n#define HIST_REDUNDANCY 256\n +\n#define GROUP_SIZE 256\n +\n#define HIST_SIZE 256\n +\n#define NUM_CHANNELS 4\n +\n#define HR_UNROLL_SIZE 8 \n +\n#define HR_UNROLL_TYPE uchar8 \n + +__attribute__((reqd_work_group_size(256, 1, 1))) +__kernel +void kernel_HistogramRectAllChannels( + __global const uchar8 *data, + uint numPixels, + __global uint *histBuffer) { + + // declare variables + uchar8 pixels; + int threadOffset = get_global_id(0)%HIST_REDUNDANCY; + + // for each pixel/channel, accumulate in global memory + for ( uint pc = get_global_id(0); pc < numPixels*NUM_CHANNELS/HR_UNROLL_SIZE; pc += get_global_size(0) ) { + pixels = data[pc]; + // channel bin thread + atomic_inc( &histBuffer[ 0*HIST_SIZE*HIST_REDUNDANCY + pixels.s0*HIST_REDUNDANCY + threadOffset ]); // ch0 + atomic_inc( &histBuffer[ 0*HIST_SIZE*HIST_REDUNDANCY + pixels.s4*HIST_REDUNDANCY + threadOffset ]); // ch0 + atomic_inc( &histBuffer[ 1*HIST_SIZE*HIST_REDUNDANCY + pixels.s1*HIST_REDUNDANCY + threadOffset ]); // ch1 + atomic_inc( &histBuffer[ 1*HIST_SIZE*HIST_REDUNDANCY + pixels.s5*HIST_REDUNDANCY + threadOffset ]); // ch1 + atomic_inc( &histBuffer[ 2*HIST_SIZE*HIST_REDUNDANCY + pixels.s2*HIST_REDUNDANCY + threadOffset ]); // ch2 + atomic_inc( &histBuffer[ 2*HIST_SIZE*HIST_REDUNDANCY + pixels.s6*HIST_REDUNDANCY + threadOffset ]); // ch2 + atomic_inc( &histBuffer[ 3*HIST_SIZE*HIST_REDUNDANCY + pixels.s3*HIST_REDUNDANCY + threadOffset ]); // ch3 + atomic_inc( &histBuffer[ 3*HIST_SIZE*HIST_REDUNDANCY + pixels.s7*HIST_REDUNDANCY + threadOffset ]); // ch3 + } +} +) + +KERNEL( +// NUM_CHANNELS = 1 +__attribute__((reqd_work_group_size(256, 1, 1))) +__kernel +void kernel_HistogramRectOneChannel( + __global const uchar8 *data, + uint numPixels, + __global uint *histBuffer) { + + // declare variables + uchar8 pixels; + int threadOffset = get_global_id(0)%HIST_REDUNDANCY; + + // for each pixel/channel, accumulate in global memory + for ( uint pc = get_global_id(0); pc < numPixels/HR_UNROLL_SIZE; pc += get_global_size(0) ) { + pixels = data[pc]; + // bin thread + atomic_inc( &histBuffer[ pixels.s0*HIST_REDUNDANCY + threadOffset ]); + atomic_inc( &histBuffer[ pixels.s1*HIST_REDUNDANCY + threadOffset ]); + atomic_inc( &histBuffer[ pixels.s2*HIST_REDUNDANCY + threadOffset ]); + atomic_inc( &histBuffer[ pixels.s3*HIST_REDUNDANCY + threadOffset ]); + atomic_inc( &histBuffer[ pixels.s4*HIST_REDUNDANCY + threadOffset ]); + atomic_inc( &histBuffer[ pixels.s5*HIST_REDUNDANCY + threadOffset ]); + atomic_inc( &histBuffer[ pixels.s6*HIST_REDUNDANCY + threadOffset ]); + atomic_inc( &histBuffer[ pixels.s7*HIST_REDUNDANCY + threadOffset ]); + } +} +) + +// HistogramRect Kernel: Reduction +// only supports 4 channels +// each work group handles a single channel of a single histogram bin +KERNEL( +__attribute__((reqd_work_group_size(256, 1, 1))) +__kernel +void kernel_HistogramRectAllChannelsReduction( + int n, // unused pixel redundancy + __global uint *histBuffer, + __global int* histResult) { + + // declare variables + int channel = get_group_id(0)/HIST_SIZE; + int bin = get_group_id(0)%HIST_SIZE; + int value = 0; + + // accumulate in register + for ( uint i = get_local_id(0); i < HIST_REDUNDANCY; i+=GROUP_SIZE) { + value += histBuffer[ channel*HIST_SIZE*HIST_REDUNDANCY+bin*HIST_REDUNDANCY+i]; + } + + // reduction in local memory + __local int localHist[GROUP_SIZE]; + localHist[get_local_id(0)] = value; + barrier(CLK_LOCAL_MEM_FENCE); + for (int stride = GROUP_SIZE/2; stride >= 1; stride /= 2) { + if (get_local_id(0) < stride) { + value = localHist[ get_local_id(0)+stride]; + } + barrier(CLK_LOCAL_MEM_FENCE); + if (get_local_id(0) < stride) { + localHist[ get_local_id(0)] += value; + } + barrier(CLK_LOCAL_MEM_FENCE); + } + + // write reduction to final result + if (get_local_id(0) == 0) { + histResult[get_group_id(0)] = localHist[0]; + } +} // kernel_HistogramRectAllChannels +) + + +KERNEL( +// NUM_CHANNELS = 1 +__attribute__((reqd_work_group_size(256, 1, 1))) +__kernel +void kernel_HistogramRectOneChannelReduction( + int n, // unused pixel redundancy + __global uint *histBuffer, + __global int* histResult) { + + // declare variables + // int channel = get_group_id(0)/HIST_SIZE; + int bin = get_group_id(0)%HIST_SIZE; + int value = 0; + + // accumulate in register + for ( int i = get_local_id(0); i < HIST_REDUNDANCY; i+=GROUP_SIZE) { + value += histBuffer[ bin*HIST_REDUNDANCY+i]; + } + + // reduction in local memory + __local int localHist[GROUP_SIZE]; + localHist[get_local_id(0)] = value; + barrier(CLK_LOCAL_MEM_FENCE); + for (int stride = GROUP_SIZE/2; stride >= 1; stride /= 2) { + if (get_local_id(0) < stride) { + value = localHist[ get_local_id(0)+stride]; + } + barrier(CLK_LOCAL_MEM_FENCE); + if (get_local_id(0) < stride) { + localHist[ get_local_id(0)] += value; + } + barrier(CLK_LOCAL_MEM_FENCE); + } + + // write reduction to final result + if (get_local_id(0) == 0) { + histResult[get_group_id(0)] = localHist[0]; + } +} // kernel_HistogramRectOneChannelReduction +) + +// ThresholdRectToPix Kernel +// only supports 4 channels +// imageData is input image (24-bits/pixel) +// pix is output image (1-bit/pixel) +KERNEL( +\n#define CHAR_VEC_WIDTH 4 \n +\n#define PIXELS_PER_WORD 32 \n +\n#define PIXELS_PER_BURST 8 \n +\n#define BURSTS_PER_WORD (PIXELS_PER_WORD/PIXELS_PER_BURST) \n + typedef union { + uchar s[PIXELS_PER_BURST*NUM_CHANNELS]; + uchar4 v[(PIXELS_PER_BURST*NUM_CHANNELS)/CHAR_VEC_WIDTH]; + } charVec; + +__attribute__((reqd_work_group_size(256, 1, 1))) +__kernel +void kernel_ThresholdRectToPix( + __global const uchar4 *imageData, + int height, + int width, + int wpl, // words per line + __global int *thresholds, + __global int *hi_values, + __global int *pix) { + + // declare variables + int pThresholds[NUM_CHANNELS]; + int pHi_Values[NUM_CHANNELS]; + for ( int i = 0; i < NUM_CHANNELS; i++) { + pThresholds[i] = thresholds[i]; + pHi_Values[i] = hi_values[i]; + } + + // for each word (32 pixels) in output image + for ( uint w = get_global_id(0); w < wpl*height; w += get_global_size(0) ) { + unsigned int word = 0; // all bits start at zero + // for each burst in word + for ( int b = 0; b < BURSTS_PER_WORD; b++) { + // load burst + charVec pixels; + int offset = (w / wpl) * width; + offset += (w % wpl) * PIXELS_PER_WORD; + offset += b * PIXELS_PER_BURST; + + for (int i = 0; i < PIXELS_PER_BURST; ++i) + pixels.v[i] = imageData[offset + i]; + + // for each pixel in burst + for ( int p = 0; p < PIXELS_PER_BURST; p++) { + for ( int c = 0; c < NUM_CHANNELS; c++) { + unsigned char pixChan = pixels.s[p*NUM_CHANNELS + c]; + if (pHi_Values[c] >= 0 && (pixChan > pThresholds[c]) == (pHi_Values[c] == 0)) { + const uint kTopBit = 0x80000000; + word |= (kTopBit >> ((b*PIXELS_PER_BURST+p)&31)); + } + } + } + } + pix[w] = word; + } +} + +\n#define CHAR_VEC_WIDTH 8 \n +\n#define PIXELS_PER_WORD 32 \n +\n#define PIXELS_PER_BURST 8 \n +\n#define BURSTS_PER_WORD (PIXELS_PER_WORD/PIXELS_PER_BURST) \n + typedef union { + uchar s[PIXELS_PER_BURST*1]; + uchar8 v[(PIXELS_PER_BURST*1)/CHAR_VEC_WIDTH]; + } charVec1; + +__attribute__((reqd_work_group_size(256, 1, 1))) +__kernel +void kernel_ThresholdRectToPix_OneChan( + __global const uchar8 *imageData, + int height, + int width, + int wpl, // words per line of output image + __global int *thresholds, + __global int *hi_values, + __global int *pix) { + + // declare variables + int pThresholds[1]; + int pHi_Values[1]; + for ( int i = 0; i < 1; i++) { + pThresholds[i] = thresholds[i]; + pHi_Values[i] = hi_values[i]; + } + + // for each word (32 pixels) in output image + for ( uint w = get_global_id(0); w < wpl*height; w += get_global_size(0) ) { + unsigned int word = 0; // all bits start at zero + + // for each burst in word + for ( int b = 0; b < BURSTS_PER_WORD; b++) { + + // load burst + charVec1 pixels; + // for each char8 in burst + pixels.v[0] = imageData[ + w*BURSTS_PER_WORD + + b + + 0 ]; + + // for each pixel in burst + for ( int p = 0; p < PIXELS_PER_BURST; p++) { + + //int littleEndianIdx = p ^ 3; + //int bigEndianIdx = p; + int idx = +\n#ifdef __ENDIAN_LITTLE__\n + p ^ 3; +\n#else\n + p; +\n#endif\n + unsigned char pixChan = pixels.s[idx]; + if (pHi_Values[0] >= 0 && (pixChan > pThresholds[0]) == (pHi_Values[0] == 0)) { + const uint kTopBit = 0x80000000; + word |= (kTopBit >> ((b*PIXELS_PER_BURST+p)&31)); + } + } + } + pix[w] = word; + } +} +) + + ; // close char* + +#endif // USE_EXTERNAL_KERNEL +#endif // TESSERACT_OPENCL_OCLKERNELS_H_ +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/src/opencl/opencl_device_selection.h b/src/opencl/opencl_device_selection.h index 5f9e6063d2..08506b301c 100644 --- a/src/opencl/opencl_device_selection.h +++ b/src/opencl/opencl_device_selection.h @@ -1,46 +1,46 @@ -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef DEVICE_SELECTION_H -#define DEVICE_SELECTION_H - -#ifdef USE_OPENCL - -#ifdef _MSC_VER -#define _CRT_SECURE_NO_WARNINGS -#endif - -#include -#include -#include - -#ifdef __APPLE__ -#include -#else -#include -#endif - -// device type -typedef enum { - DS_DEVICE_NATIVE_CPU = 0, - DS_DEVICE_OPENCL_DEVICE -} ds_device_type; - -typedef struct { - ds_device_type type; - cl_device_id oclDeviceID; - char* oclDeviceName; - char* oclDriverVersion; - // a pointer to the score data, the content/format is application defined. - void* score; -} ds_device; - -#endif // USE_OPENCL -#endif // DEVICE_SELECTION_H +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef DEVICE_SELECTION_H +#define DEVICE_SELECTION_H + +#ifdef USE_OPENCL + +#ifdef _MSC_VER +#define _CRT_SECURE_NO_WARNINGS +#endif + +#include +#include +#include + +#ifdef __APPLE__ +#include +#else +#include +#endif + +// device type +typedef enum { + DS_DEVICE_NATIVE_CPU = 0, + DS_DEVICE_OPENCL_DEVICE +} ds_device_type; + +typedef struct { + ds_device_type type; + cl_device_id oclDeviceID; + char* oclDeviceName; + char* oclDriverVersion; + // a pointer to the score data, the content/format is application defined. + void* score; +} ds_device; + +#endif // USE_OPENCL +#endif // DEVICE_SELECTION_H diff --git a/src/opencl/openclwrapper.cpp b/src/opencl/openclwrapper.cpp index dbe54fd4f1..88e6d495c9 100644 --- a/src/opencl/openclwrapper.cpp +++ b/src/opencl/openclwrapper.cpp @@ -1,2729 +1,2729 @@ -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -#ifdef _WIN32 -#include -#else -#include -#include -#endif -#include - -#include "openclwrapper.h" -#include "oclkernels.h" - -// for micro-benchmark -#include "otsuthr.h" -#include "thresholder.h" - -#if ON_APPLE -#include -#include -#endif - -#define CALLOC LEPT_CALLOC -#define FREE LEPT_FREE - -#ifdef USE_OPENCL - -#include "opencl_device_selection.h" -GPUEnv OpenclDevice::gpuEnv; - -bool OpenclDevice::deviceIsSelected = false; -ds_device OpenclDevice::selectedDevice; - -int OpenclDevice::isInited = 0; - -static l_int32 MORPH_BC = ASYMMETRIC_MORPH_BC; - -static const l_uint32 lmask32[] = { - 0x80000000, 0xc0000000, 0xe0000000, 0xf0000000, 0xf8000000, 0xfc000000, - 0xfe000000, 0xff000000, 0xff800000, 0xffc00000, 0xffe00000, 0xfff00000, - 0xfff80000, 0xfffc0000, 0xfffe0000, 0xffff0000, 0xffff8000, 0xffffc000, - 0xffffe000, 0xfffff000, 0xfffff800, 0xfffffc00, 0xfffffe00, 0xffffff00, - 0xffffff80, 0xffffffc0, 0xffffffe0, 0xfffffff0, 0xfffffff8, 0xfffffffc, - 0xfffffffe, 0xffffffff}; - -static const l_uint32 rmask32[] = { - 0x00000001, 0x00000003, 0x00000007, 0x0000000f, 0x0000001f, 0x0000003f, - 0x0000007f, 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff, - 0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff, 0x0001ffff, 0x0003ffff, - 0x0007ffff, 0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff, 0x00ffffff, - 0x01ffffff, 0x03ffffff, 0x07ffffff, 0x0fffffff, 0x1fffffff, 0x3fffffff, - 0x7fffffff, 0xffffffff}; - -static cl_mem pixsCLBuffer, pixdCLBuffer, - pixdCLIntermediate; // Morph operations buffers -static cl_mem pixThBuffer; // output from thresholdtopix calculation -static cl_int clStatus; -static KernelEnv rEnv; - -#define DS_TAG_VERSION "" -#define DS_TAG_VERSION_END "" -#define DS_TAG_DEVICE "" -#define DS_TAG_DEVICE_END "" -#define DS_TAG_SCORE "" -#define DS_TAG_SCORE_END "" -#define DS_TAG_DEVICE_TYPE "" -#define DS_TAG_DEVICE_TYPE_END "" -#define DS_TAG_DEVICE_NAME "" -#define DS_TAG_DEVICE_NAME_END "" -#define DS_TAG_DEVICE_DRIVER_VERSION "" -#define DS_TAG_DEVICE_DRIVER_VERSION_END "" - -#define DS_DEVICE_NATIVE_CPU_STRING "native_cpu" - -#define DS_DEVICE_NAME_LENGTH 256 - -typedef enum { DS_EVALUATE_ALL, DS_EVALUATE_NEW_ONLY } ds_evaluation_type; - -typedef struct { - unsigned int numDevices; - ds_device *devices; - const char *version; -} ds_profile; - -typedef enum { - DS_SUCCESS = 0, - DS_INVALID_PROFILE = 1000, - DS_MEMORY_ERROR, - DS_INVALID_PERF_EVALUATOR_TYPE, - DS_INVALID_PERF_EVALUATOR, - DS_PERF_EVALUATOR_ERROR, - DS_FILE_ERROR, - DS_UNKNOWN_DEVICE_TYPE, - DS_PROFILE_FILE_ERROR, - DS_SCORE_SERIALIZER_ERROR, - DS_SCORE_DESERIALIZER_ERROR -} ds_status; - -// Pointer to a function that calculates the score of a device (ex: -// device->score) update the data size of score. The encoding and the format -// of the score data is implementation defined. The function should return -// DS_SUCCESS if there's no error to be reported. -typedef ds_status (*ds_perf_evaluator)(ds_device *device, void *data); - -// deallocate memory used by score -typedef ds_status (*ds_score_release)(void *score); -static ds_status releaseDSProfile(ds_profile *profile, ds_score_release sr) { - ds_status status = DS_SUCCESS; - if (profile != nullptr) { - if (profile->devices != nullptr && sr != nullptr) { - unsigned int i; - for (i = 0; i < profile->numDevices; i++) { - free(profile->devices[i].oclDeviceName); - free(profile->devices[i].oclDriverVersion); - status = sr(profile->devices[i].score); - if (status != DS_SUCCESS) break; - } - free(profile->devices); - } - free(profile); - } - return status; -} - -static ds_status initDSProfile(ds_profile **p, const char *version) { - int numDevices; - cl_uint numPlatforms; - cl_platform_id *platforms = nullptr; - cl_device_id *devices = nullptr; - ds_status status = DS_SUCCESS; - unsigned int next; - unsigned int i; - - if (p == nullptr) return DS_INVALID_PROFILE; - - ds_profile *profile = (ds_profile *)malloc(sizeof(ds_profile)); - if (profile == nullptr) return DS_MEMORY_ERROR; - - memset(profile, 0, sizeof(ds_profile)); - - clGetPlatformIDs(0, nullptr, &numPlatforms); - - if (numPlatforms > 0) { - platforms = (cl_platform_id *)malloc(numPlatforms * sizeof(cl_platform_id)); - if (platforms == nullptr) { - status = DS_MEMORY_ERROR; - goto cleanup; - } - clGetPlatformIDs(numPlatforms, platforms, nullptr); - } - - numDevices = 0; - for (i = 0; i < (unsigned int)numPlatforms; i++) { - cl_uint num; - clGetDeviceIDs(platforms[i], CL_DEVICE_TYPE_ALL, 0, nullptr, &num); - numDevices += num; - } - - if (numDevices > 0) { - devices = (cl_device_id *)malloc(numDevices * sizeof(cl_device_id)); - if (devices == nullptr) { - status = DS_MEMORY_ERROR; - goto cleanup; - } - } - - profile->numDevices = - numDevices + 1; // +1 to numDevices to include the native CPU - profile->devices = - (ds_device *)malloc(profile->numDevices * sizeof(ds_device)); - if (profile->devices == nullptr) { - profile->numDevices = 0; - status = DS_MEMORY_ERROR; - goto cleanup; - } - memset(profile->devices, 0, profile->numDevices * sizeof(ds_device)); - - next = 0; - for (i = 0; i < (unsigned int)numPlatforms; i++) { - cl_uint num; - unsigned j; - clGetDeviceIDs(platforms[i], CL_DEVICE_TYPE_ALL, numDevices, devices, &num); - for (j = 0; j < num; j++, next++) { - char buffer[DS_DEVICE_NAME_LENGTH]; - size_t length; - - profile->devices[next].type = DS_DEVICE_OPENCL_DEVICE; - profile->devices[next].oclDeviceID = devices[j]; - - clGetDeviceInfo(profile->devices[next].oclDeviceID, CL_DEVICE_NAME, - DS_DEVICE_NAME_LENGTH, &buffer, nullptr); - length = strlen(buffer); - profile->devices[next].oclDeviceName = (char *)malloc(length + 1); - memcpy(profile->devices[next].oclDeviceName, buffer, length + 1); - - clGetDeviceInfo(profile->devices[next].oclDeviceID, CL_DRIVER_VERSION, - DS_DEVICE_NAME_LENGTH, &buffer, nullptr); - length = strlen(buffer); - profile->devices[next].oclDriverVersion = (char *)malloc(length + 1); - memcpy(profile->devices[next].oclDriverVersion, buffer, length + 1); - } - } - profile->devices[next].type = DS_DEVICE_NATIVE_CPU; - profile->version = version; - -cleanup: - free(platforms); - free(devices); - if (status == DS_SUCCESS) { - *p = profile; - } else { - if (profile) { - free(profile->devices); - free(profile); - } - } - return status; -} - -static ds_status profileDevices(ds_profile *profile, - const ds_evaluation_type type, - ds_perf_evaluator evaluator, - void *evaluatorData, unsigned int *numUpdates) { - ds_status status = DS_SUCCESS; - unsigned int i; - unsigned int updates = 0; - - if (profile == nullptr) { - return DS_INVALID_PROFILE; - } - if (evaluator == nullptr) { - return DS_INVALID_PERF_EVALUATOR; - } - - for (i = 0; i < profile->numDevices; i++) { - ds_status evaluatorStatus; - - switch (type) { - case DS_EVALUATE_NEW_ONLY: - if (profile->devices[i].score != nullptr) break; - // else fall through - case DS_EVALUATE_ALL: - evaluatorStatus = evaluator(profile->devices + i, evaluatorData); - if (evaluatorStatus != DS_SUCCESS) { - status = evaluatorStatus; - return status; - } - updates++; - break; - default: - return DS_INVALID_PERF_EVALUATOR_TYPE; - break; - }; - } - if (numUpdates) *numUpdates = updates; - return status; -} - -static const char *findString(const char *contentStart, const char *contentEnd, - const char *string) { - size_t stringLength; - const char *currentPosition; - const char *found = nullptr; - stringLength = strlen(string); - currentPosition = contentStart; - for (currentPosition = contentStart; currentPosition < contentEnd; - currentPosition++) { - if (*currentPosition == string[0]) { - if (currentPosition + stringLength < contentEnd) { - if (strncmp(currentPosition, string, stringLength) == 0) { - found = currentPosition; - break; - } - } - } - } - return found; -} - -static ds_status readProFile(const char *fileName, char **content, - size_t *contentSize) { - size_t size = 0; - - *contentSize = 0; - *content = nullptr; - - FILE *input = fopen(fileName, "rb"); - if (input == nullptr) { - return DS_FILE_ERROR; - } - - fseek(input, 0L, SEEK_END); - size = ftell(input); - rewind(input); - char *binary = (char *)malloc(size); - if (binary == nullptr) { - fclose(input); - return DS_FILE_ERROR; - } - fread(binary, sizeof(char), size, input); - fclose(input); - - *contentSize = size; - *content = binary; - return DS_SUCCESS; -} - -typedef ds_status (*ds_score_deserializer)(ds_device *device, - const unsigned char *serializedScore, - unsigned int serializedScoreSize); - -static ds_status readProfileFromFile(ds_profile *profile, - ds_score_deserializer deserializer, - const char *file) { - ds_status status = DS_SUCCESS; - char *contentStart = nullptr; - const char *contentEnd = nullptr; - size_t contentSize; - - if (profile == nullptr) return DS_INVALID_PROFILE; - - status = readProFile(file, &contentStart, &contentSize); - if (status == DS_SUCCESS) { - const char *currentPosition; - const char *dataStart; - const char *dataEnd; - - contentEnd = contentStart + contentSize; - currentPosition = contentStart; - - // parse the version string - dataStart = findString(currentPosition, contentEnd, DS_TAG_VERSION); - if (dataStart == nullptr) { - status = DS_PROFILE_FILE_ERROR; - goto cleanup; - } - dataStart += strlen(DS_TAG_VERSION); - - dataEnd = findString(dataStart, contentEnd, DS_TAG_VERSION_END); - if (dataEnd == nullptr) { - status = DS_PROFILE_FILE_ERROR; - goto cleanup; - } - - size_t versionStringLength = strlen(profile->version); - if (versionStringLength + dataStart != dataEnd || - strncmp(profile->version, dataStart, versionStringLength) != 0) { - // version mismatch - status = DS_PROFILE_FILE_ERROR; - goto cleanup; - } - currentPosition = dataEnd + strlen(DS_TAG_VERSION_END); - - // parse the device information - while (1) { - unsigned int i; - - const char *deviceTypeStart; - const char *deviceTypeEnd; - ds_device_type deviceType; - - const char *deviceNameStart; - const char *deviceNameEnd; - - const char *deviceScoreStart; - const char *deviceScoreEnd; - - const char *deviceDriverStart; - const char *deviceDriverEnd; - - dataStart = findString(currentPosition, contentEnd, DS_TAG_DEVICE); - if (dataStart == nullptr) { - // nothing useful remain, quit... - break; - } - dataStart += strlen(DS_TAG_DEVICE); - dataEnd = findString(dataStart, contentEnd, DS_TAG_DEVICE_END); - if (dataEnd == nullptr) { - status = DS_PROFILE_FILE_ERROR; - goto cleanup; - } - - // parse the device type - deviceTypeStart = findString(dataStart, contentEnd, DS_TAG_DEVICE_TYPE); - if (deviceTypeStart == nullptr) { - status = DS_PROFILE_FILE_ERROR; - goto cleanup; - } - deviceTypeStart += strlen(DS_TAG_DEVICE_TYPE); - deviceTypeEnd = - findString(deviceTypeStart, contentEnd, DS_TAG_DEVICE_TYPE_END); - if (deviceTypeEnd == nullptr) { - status = DS_PROFILE_FILE_ERROR; - goto cleanup; - } - memcpy(&deviceType, deviceTypeStart, sizeof(ds_device_type)); - - // parse the device name - if (deviceType == DS_DEVICE_OPENCL_DEVICE) { - deviceNameStart = findString(dataStart, contentEnd, DS_TAG_DEVICE_NAME); - if (deviceNameStart == nullptr) { - status = DS_PROFILE_FILE_ERROR; - goto cleanup; - } - deviceNameStart += strlen(DS_TAG_DEVICE_NAME); - deviceNameEnd = - findString(deviceNameStart, contentEnd, DS_TAG_DEVICE_NAME_END); - if (deviceNameEnd == nullptr) { - status = DS_PROFILE_FILE_ERROR; - goto cleanup; - } - - deviceDriverStart = - findString(dataStart, contentEnd, DS_TAG_DEVICE_DRIVER_VERSION); - if (deviceDriverStart == nullptr) { - status = DS_PROFILE_FILE_ERROR; - goto cleanup; - } - deviceDriverStart += strlen(DS_TAG_DEVICE_DRIVER_VERSION); - deviceDriverEnd = findString(deviceDriverStart, contentEnd, - DS_TAG_DEVICE_DRIVER_VERSION_END); - if (deviceDriverEnd == nullptr) { - status = DS_PROFILE_FILE_ERROR; - goto cleanup; - } - - // check if this device is on the system - for (i = 0; i < profile->numDevices; i++) { - if (profile->devices[i].type == DS_DEVICE_OPENCL_DEVICE) { - size_t actualDeviceNameLength; - size_t driverVersionLength; - - actualDeviceNameLength = strlen(profile->devices[i].oclDeviceName); - driverVersionLength = strlen(profile->devices[i].oclDriverVersion); - if (deviceNameStart + actualDeviceNameLength == deviceNameEnd && - deviceDriverStart + driverVersionLength == deviceDriverEnd && - strncmp(profile->devices[i].oclDeviceName, deviceNameStart, - actualDeviceNameLength) == 0 && - strncmp(profile->devices[i].oclDriverVersion, deviceDriverStart, - driverVersionLength) == 0) { - deviceScoreStart = - findString(dataStart, contentEnd, DS_TAG_SCORE); - if (deviceNameStart == nullptr) { - status = DS_PROFILE_FILE_ERROR; - goto cleanup; - } - deviceScoreStart += strlen(DS_TAG_SCORE); - deviceScoreEnd = - findString(deviceScoreStart, contentEnd, DS_TAG_SCORE_END); - status = deserializer(profile->devices + i, - (const unsigned char *)deviceScoreStart, - deviceScoreEnd - deviceScoreStart); - if (status != DS_SUCCESS) { - goto cleanup; - } - } - } - } - } else if (deviceType == DS_DEVICE_NATIVE_CPU) { - for (i = 0; i < profile->numDevices; i++) { - if (profile->devices[i].type == DS_DEVICE_NATIVE_CPU) { - deviceScoreStart = findString(dataStart, contentEnd, DS_TAG_SCORE); - if (deviceScoreStart == nullptr) { - status = DS_PROFILE_FILE_ERROR; - goto cleanup; - } - deviceScoreStart += strlen(DS_TAG_SCORE); - deviceScoreEnd = - findString(deviceScoreStart, contentEnd, DS_TAG_SCORE_END); - status = deserializer(profile->devices + i, - (const unsigned char *)deviceScoreStart, - deviceScoreEnd - deviceScoreStart); - if (status != DS_SUCCESS) { - goto cleanup; - } - } - } - } - - // skip over the current one to find the next device - currentPosition = dataEnd + strlen(DS_TAG_DEVICE_END); - } - } -cleanup: - free(contentStart); - return status; -} - -typedef ds_status (*ds_score_serializer)(ds_device *device, - void **serializedScore, - unsigned int *serializedScoreSize); -static ds_status writeProfileToFile(ds_profile *profile, - ds_score_serializer serializer, - const char *file) { - ds_status status = DS_SUCCESS; - - if (profile == nullptr) return DS_INVALID_PROFILE; - - FILE *profileFile = fopen(file, "wb"); - if (profileFile == nullptr) { - status = DS_FILE_ERROR; - } else { - unsigned int i; - - // write version string - fwrite(DS_TAG_VERSION, sizeof(char), strlen(DS_TAG_VERSION), profileFile); - fwrite(profile->version, sizeof(char), strlen(profile->version), - profileFile); - fwrite(DS_TAG_VERSION_END, sizeof(char), strlen(DS_TAG_VERSION_END), - profileFile); - fwrite("\n", sizeof(char), 1, profileFile); - - for (i = 0; i < profile->numDevices && status == DS_SUCCESS; i++) { - void *serializedScore; - unsigned int serializedScoreSize; - - fwrite(DS_TAG_DEVICE, sizeof(char), strlen(DS_TAG_DEVICE), profileFile); - - fwrite(DS_TAG_DEVICE_TYPE, sizeof(char), strlen(DS_TAG_DEVICE_TYPE), - profileFile); - fwrite(&profile->devices[i].type, sizeof(ds_device_type), 1, profileFile); - fwrite(DS_TAG_DEVICE_TYPE_END, sizeof(char), - strlen(DS_TAG_DEVICE_TYPE_END), profileFile); - - switch (profile->devices[i].type) { - case DS_DEVICE_NATIVE_CPU: { - // There's no need to emit a device name for the native CPU device. - /* - fwrite(DS_TAG_DEVICE_NAME, sizeof(char), strlen(DS_TAG_DEVICE_NAME), - profileFile); - fwrite(DS_DEVICE_NATIVE_CPU_STRING,sizeof(char), - strlen(DS_DEVICE_NATIVE_CPU_STRING), profileFile); - fwrite(DS_TAG_DEVICE_NAME_END, sizeof(char), - strlen(DS_TAG_DEVICE_NAME_END), profileFile); - */ - } break; - case DS_DEVICE_OPENCL_DEVICE: { - fwrite(DS_TAG_DEVICE_NAME, sizeof(char), strlen(DS_TAG_DEVICE_NAME), - profileFile); - fwrite(profile->devices[i].oclDeviceName, sizeof(char), - strlen(profile->devices[i].oclDeviceName), profileFile); - fwrite(DS_TAG_DEVICE_NAME_END, sizeof(char), - strlen(DS_TAG_DEVICE_NAME_END), profileFile); - - fwrite(DS_TAG_DEVICE_DRIVER_VERSION, sizeof(char), - strlen(DS_TAG_DEVICE_DRIVER_VERSION), profileFile); - fwrite(profile->devices[i].oclDriverVersion, sizeof(char), - strlen(profile->devices[i].oclDriverVersion), profileFile); - fwrite(DS_TAG_DEVICE_DRIVER_VERSION_END, sizeof(char), - strlen(DS_TAG_DEVICE_DRIVER_VERSION_END), profileFile); - } break; - default: - status = DS_UNKNOWN_DEVICE_TYPE; - break; - }; - - fwrite(DS_TAG_SCORE, sizeof(char), strlen(DS_TAG_SCORE), profileFile); - status = serializer(profile->devices + i, &serializedScore, - &serializedScoreSize); - if (status == DS_SUCCESS && serializedScore != nullptr && - serializedScoreSize > 0) { - fwrite(serializedScore, sizeof(char), serializedScoreSize, profileFile); - free(serializedScore); - } - fwrite(DS_TAG_SCORE_END, sizeof(char), strlen(DS_TAG_SCORE_END), - profileFile); - fwrite(DS_TAG_DEVICE_END, sizeof(char), strlen(DS_TAG_DEVICE_END), - profileFile); - fwrite("\n", sizeof(char), 1, profileFile); - } - fclose(profileFile); - } - return status; -} - -// substitute invalid characters in device name with _ -static void legalizeFileName(char *fileName) { - // printf("fileName: %s\n", fileName); - const char *invalidChars = - "/\?:*\"><| "; // space is valid but can cause headaches - // for each invalid char - for (unsigned i = 0; i < strlen(invalidChars); i++) { - char invalidStr[4]; - invalidStr[0] = invalidChars[i]; - invalidStr[1] = '\0'; - // printf("eliminating %s\n", invalidStr); - // char *pos = strstr(fileName, invalidStr); - // initial ./ is valid for present directory - // if (*pos == '.') pos++; - // if (*pos == '/') pos++; - for (char *pos = strstr(fileName, invalidStr); pos != nullptr; - pos = strstr(pos + 1, invalidStr)) { - // printf("\tfound: %s, ", pos); - pos[0] = '_'; - // printf("fileName: %s\n", fileName); - } - } -} - -static void populateGPUEnvFromDevice(GPUEnv *gpuInfo, cl_device_id device) { - // printf("[DS] populateGPUEnvFromDevice\n"); - size_t size; - gpuInfo->mnIsUserCreated = 1; - // device - gpuInfo->mpDevID = device; - gpuInfo->mpArryDevsID = new cl_device_id[1]; - gpuInfo->mpArryDevsID[0] = gpuInfo->mpDevID; - clStatus = clGetDeviceInfo(gpuInfo->mpDevID, CL_DEVICE_TYPE, - sizeof(cl_device_type), &gpuInfo->mDevType, &size); - CHECK_OPENCL(clStatus, "populateGPUEnv::getDeviceInfo(TYPE)"); - // platform - clStatus = - clGetDeviceInfo(gpuInfo->mpDevID, CL_DEVICE_PLATFORM, - sizeof(cl_platform_id), &gpuInfo->mpPlatformID, &size); - CHECK_OPENCL(clStatus, "populateGPUEnv::getDeviceInfo(PLATFORM)"); - // context - cl_context_properties props[3]; - props[0] = CL_CONTEXT_PLATFORM; - props[1] = (cl_context_properties)gpuInfo->mpPlatformID; - props[2] = 0; - gpuInfo->mpContext = - clCreateContext(props, 1, &gpuInfo->mpDevID, nullptr, nullptr, &clStatus); - CHECK_OPENCL(clStatus, "populateGPUEnv::createContext"); - // queue - cl_command_queue_properties queueProperties = 0; - gpuInfo->mpCmdQueue = clCreateCommandQueue( - gpuInfo->mpContext, gpuInfo->mpDevID, queueProperties, &clStatus); - CHECK_OPENCL(clStatus, "populateGPUEnv::createCommandQueue"); -} - -int OpenclDevice::LoadOpencl() -{ -#ifdef WIN32 - HINSTANCE HOpenclDll = nullptr; - void *OpenclDll = nullptr; - // fprintf(stderr, " LoadOpenclDllxx... \n"); - OpenclDll = static_cast(HOpenclDll); - OpenclDll = LoadLibrary("openCL.dll"); - if (!static_cast(OpenclDll)) { - fprintf(stderr, "[OD] Load opencl.dll failed!\n"); - FreeLibrary(static_cast(OpenclDll)); - return 0; - } - fprintf(stderr, "[OD] Load opencl.dll successful!\n"); -#endif - return 1; -} -int OpenclDevice::SetKernelEnv( KernelEnv *envInfo ) -{ - envInfo->mpkContext = gpuEnv.mpContext; - envInfo->mpkCmdQueue = gpuEnv.mpCmdQueue; - envInfo->mpkProgram = gpuEnv.mpArryPrograms[0]; - - return 1; -} - -static cl_mem allocateZeroCopyBuffer(KernelEnv rEnv, l_uint32 *hostbuffer, - size_t nElements, cl_mem_flags flags, - cl_int *pStatus) { - cl_mem membuffer = - clCreateBuffer(rEnv.mpkContext, (cl_mem_flags)(flags), - nElements * sizeof(l_uint32), hostbuffer, pStatus); - - return membuffer; -} - -static Pix *mapOutputCLBuffer(KernelEnv rEnv, cl_mem clbuffer, Pix *pixd, - Pix *pixs, int elements, cl_mem_flags flags, - bool memcopy = false, bool sync = true) { - PROCNAME("mapOutputCLBuffer"); - if (!pixd) { - if (memcopy) { - if ((pixd = pixCreateTemplate(pixs)) == nullptr) - tprintf("pixd not made\n"); - } else { - if ((pixd = pixCreateHeader(pixGetWidth(pixs), pixGetHeight(pixs), - pixGetDepth(pixs))) == nullptr) - tprintf("pixd not made\n"); - } - } - l_uint32 *pValues = (l_uint32 *)clEnqueueMapBuffer( - rEnv.mpkCmdQueue, clbuffer, CL_TRUE, flags, 0, - elements * sizeof(l_uint32), 0, nullptr, nullptr, nullptr); - - if (memcopy) { - memcpy(pixGetData(pixd), pValues, elements * sizeof(l_uint32)); - } else { - pixSetData(pixd, pValues); - } - - clEnqueueUnmapMemObject(rEnv.mpkCmdQueue, clbuffer, pValues, 0, nullptr, - nullptr); - - if (sync) { - clFinish(rEnv.mpkCmdQueue); - } - - return pixd; -} - -void OpenclDevice::releaseMorphCLBuffers() -{ - if (pixdCLIntermediate != nullptr) clReleaseMemObject(pixdCLIntermediate); - if (pixsCLBuffer != nullptr) clReleaseMemObject(pixsCLBuffer); - if (pixdCLBuffer != nullptr) clReleaseMemObject(pixdCLBuffer); - if (pixThBuffer != nullptr) clReleaseMemObject(pixThBuffer); - pixdCLIntermediate = pixsCLBuffer = pixdCLBuffer = pixThBuffer = nullptr; -} - -int OpenclDevice::initMorphCLAllocations(l_int32 wpl, l_int32 h, Pix *pixs) { - SetKernelEnv(&rEnv); - - if (pixThBuffer != nullptr) { - pixsCLBuffer = allocateZeroCopyBuffer(rEnv, nullptr, wpl * h, - CL_MEM_ALLOC_HOST_PTR, &clStatus); - - // Get the output from ThresholdToPix operation - clStatus = - clEnqueueCopyBuffer(rEnv.mpkCmdQueue, pixThBuffer, pixsCLBuffer, 0, 0, - sizeof(l_uint32) * wpl * h, 0, nullptr, nullptr); - } else { - // Get data from the source image - l_uint32 *srcdata = - reinterpret_cast(malloc(wpl * h * sizeof(l_uint32))); - memcpy(srcdata, pixGetData(pixs), wpl * h * sizeof(l_uint32)); - - pixsCLBuffer = allocateZeroCopyBuffer(rEnv, srcdata, wpl * h, - CL_MEM_USE_HOST_PTR, &clStatus); - } - - pixdCLBuffer = allocateZeroCopyBuffer(rEnv, nullptr, wpl * h, - CL_MEM_ALLOC_HOST_PTR, &clStatus); - - pixdCLIntermediate = allocateZeroCopyBuffer(rEnv, nullptr, wpl * h, - CL_MEM_ALLOC_HOST_PTR, &clStatus); - - return (int)clStatus; -} - -int OpenclDevice::InitEnv() -{ -//PERF_COUNT_START("OD::InitEnv") -// printf("[OD] OpenclDevice::InitEnv()\n"); -#ifdef SAL_WIN32 - while( 1 ) - { - if( 1 == LoadOpencl() ) - break; - } -PERF_COUNT_SUB("LoadOpencl") -#endif - // sets up environment, compiles programs - - InitOpenclRunEnv_DeviceSelection( 0 ); -//PERF_COUNT_SUB("called InitOpenclRunEnv_DS") -//PERF_COUNT_END - return 1; -} - -int OpenclDevice::ReleaseOpenclRunEnv() -{ - ReleaseOpenclEnv( &gpuEnv ); -#ifdef SAL_WIN32 - FreeOpenclDll(); -#endif - return 1; -} -inline int OpenclDevice::AddKernelConfig( int kCount, const char *kName ) -{ - if ( kCount < 1 ) - fprintf(stderr,"Error: ( KCount < 1 ) AddKernelConfig\n" ); - strcpy( gpuEnv.mArrykernelNames[kCount-1], kName ); - gpuEnv.mnKernelCount++; - return 0; -} -int OpenclDevice::RegistOpenclKernel() -{ - if ( !gpuEnv.mnIsUserCreated ) - memset( &gpuEnv, 0, sizeof(gpuEnv) ); - - gpuEnv.mnFileCount = 0; //argc; - gpuEnv.mnKernelCount = 0UL; - - AddKernelConfig( 1, (const char*) "oclAverageSub1" ); - return 0; -} - -int OpenclDevice::InitOpenclRunEnv_DeviceSelection( int argc ) { -//PERF_COUNT_START("InitOpenclRunEnv_DS") - if (!isInited) { - // after programs compiled, selects best device - ds_device bestDevice_DS = getDeviceSelection( ); -//PERF_COUNT_SUB("called getDeviceSelection()") - cl_device_id bestDevice = bestDevice_DS.oclDeviceID; - // overwrite global static GPUEnv with new device - if (selectedDeviceIsOpenCL() ) { - //printf("[DS] InitOpenclRunEnv_DS::Calling populateGPUEnvFromDevice() for selected device\n"); - populateGPUEnvFromDevice( &gpuEnv, bestDevice ); - gpuEnv.mnFileCount = 0; //argc; - gpuEnv.mnKernelCount = 0UL; -//PERF_COUNT_SUB("populate gpuEnv") - CompileKernelFile(&gpuEnv, ""); -//PERF_COUNT_SUB("CompileKernelFile") - } else { - //printf("[DS] InitOpenclRunEnv_DS::Skipping populateGPUEnvFromDevice() b/c native cpu selected\n"); - } - isInited = 1; - } -//PERF_COUNT_END - return 0; -} - - -OpenclDevice::OpenclDevice() -{ - //InitEnv(); -} - -OpenclDevice::~OpenclDevice() -{ - //ReleaseOpenclRunEnv(); -} - -int OpenclDevice::ReleaseOpenclEnv( GPUEnv *gpuInfo ) -{ - int i = 0; - int clStatus = 0; - - if ( !isInited ) - { - return 1; - } - - for ( i = 0; i < gpuEnv.mnFileCount; i++ ) - { - if ( gpuEnv.mpArryPrograms[i] ) - { - clStatus = clReleaseProgram( gpuEnv.mpArryPrograms[i] ); - CHECK_OPENCL( clStatus, "clReleaseProgram" ); - gpuEnv.mpArryPrograms[i] = nullptr; - } - } - if ( gpuEnv.mpCmdQueue ) - { - clReleaseCommandQueue( gpuEnv.mpCmdQueue ); - gpuEnv.mpCmdQueue = nullptr; - } - if ( gpuEnv.mpContext ) - { - clReleaseContext( gpuEnv.mpContext ); - gpuEnv.mpContext = nullptr; - } - isInited = 0; - gpuInfo->mnIsUserCreated = 0; - delete[] gpuInfo->mpArryDevsID; - return 1; -} -int OpenclDevice::BinaryGenerated( const char * clFileName, FILE ** fhandle ) -{ - unsigned int i = 0; - cl_int clStatus; - int status = 0; - char *str = nullptr; - FILE *fd = nullptr; - char fileName[256] = {0}, cl_name[128] = {0}; - char deviceName[1024]; - clStatus = clGetDeviceInfo(gpuEnv.mpArryDevsID[i], CL_DEVICE_NAME, - sizeof(deviceName), deviceName, nullptr); - CHECK_OPENCL(clStatus, "clGetDeviceInfo"); - str = (char *)strstr(clFileName, (char *)".cl"); - memcpy(cl_name, clFileName, str - clFileName); - cl_name[str - clFileName] = '\0'; - sprintf(fileName, "%s-%s.bin", cl_name, deviceName); - legalizeFileName(fileName); - fd = fopen(fileName, "rb"); - status = (fd != nullptr) ? 1 : 0; - if (fd != nullptr) { - *fhandle = fd; - } - return status; - -} -int OpenclDevice::CachedOfKernerPrg( const GPUEnv *gpuEnvCached, const char * clFileName ) -{ - int i; - for ( i = 0; i < gpuEnvCached->mnFileCount; i++ ) - { - if ( strcasecmp( gpuEnvCached->mArryKnelSrcFile[i], clFileName ) == 0 ) - { - if (gpuEnvCached->mpArryPrograms[i] != nullptr) { - return 1; - } - } - } - - return 0; -} -int OpenclDevice::WriteBinaryToFile( const char* fileName, const char* birary, size_t numBytes ) -{ - FILE *output = nullptr; - output = fopen(fileName, "wb"); - if (output == nullptr) { - return 0; - } - - fwrite( birary, sizeof(char), numBytes, output ); - fclose( output ); - - return 1; - -} -int OpenclDevice::GeneratBinFromKernelSource( cl_program program, const char * clFileName ) -{ - unsigned int i = 0; - cl_int clStatus; - size_t *binarySizes; - cl_uint numDevices; - cl_device_id *mpArryDevsID; - char **binaries, *str = nullptr; - - clStatus = clGetProgramInfo(program, CL_PROGRAM_NUM_DEVICES, - sizeof(numDevices), &numDevices, nullptr); - CHECK_OPENCL( clStatus, "clGetProgramInfo" ); - - mpArryDevsID = (cl_device_id*) malloc( sizeof(cl_device_id) * numDevices ); - if (mpArryDevsID == nullptr) { - return 0; - } - /* grab the handles to all of the devices in the program. */ - clStatus = clGetProgramInfo(program, CL_PROGRAM_DEVICES, - sizeof(cl_device_id) * numDevices, mpArryDevsID, - nullptr); - CHECK_OPENCL( clStatus, "clGetProgramInfo" ); - - /* figure out the sizes of each of the binaries. */ - binarySizes = (size_t*) malloc( sizeof(size_t) * numDevices ); - - clStatus = - clGetProgramInfo(program, CL_PROGRAM_BINARY_SIZES, - sizeof(size_t) * numDevices, binarySizes, nullptr); - CHECK_OPENCL( clStatus, "clGetProgramInfo" ); - - /* copy over all of the generated binaries. */ - binaries = (char**) malloc( sizeof(char *) * numDevices ); - if (binaries == nullptr) { - return 0; - } - - for ( i = 0; i < numDevices; i++ ) - { - if ( binarySizes[i] != 0 ) - { - binaries[i] = (char*) malloc( sizeof(char) * binarySizes[i] ); - if (binaries[i] == nullptr) { - return 0; - } - } - else - { - binaries[i] = nullptr; - } - } - - clStatus = clGetProgramInfo(program, CL_PROGRAM_BINARIES, - sizeof(char *) * numDevices, binaries, nullptr); - CHECK_OPENCL(clStatus,"clGetProgramInfo"); - - /* dump out each binary into its own separate file. */ - for ( i = 0; i < numDevices; i++ ) - { - char fileName[256] = { 0 }, cl_name[128] = { 0 }; - - if ( binarySizes[i] != 0 ) - { - char deviceName[1024]; - clStatus = clGetDeviceInfo(mpArryDevsID[i], CL_DEVICE_NAME, - sizeof(deviceName), deviceName, nullptr); - CHECK_OPENCL( clStatus, "clGetDeviceInfo" ); - - str = (char*) strstr( clFileName, (char*) ".cl" ); - memcpy( cl_name, clFileName, str - clFileName ); - cl_name[str - clFileName] = '\0'; - sprintf( fileName, "%s-%s.bin", cl_name, deviceName ); - legalizeFileName(fileName); - if ( !WriteBinaryToFile( fileName, binaries[i], binarySizes[i] ) ) - { - printf("[OD] write binary[%s] failed\n", fileName); - return 0; - } //else - printf("[OD] write binary[%s] successfully\n", fileName); - } - } - - // Release all resouces and memory - for ( i = 0; i < numDevices; i++ ) - { - free(binaries[i]); - binaries[i] = nullptr; - } - - free(binaries); - binaries = nullptr; - - free(binarySizes); - binarySizes = nullptr; - - free(mpArryDevsID); - mpArryDevsID = nullptr; - - return 1; -} - -int OpenclDevice::CompileKernelFile( GPUEnv *gpuInfo, const char *buildOption ) -{ -//PERF_COUNT_START("CompileKernelFile") - cl_int clStatus = 0; - size_t length; - char *buildLog = nullptr, *binary; - const char *source; - size_t source_size[1]; - int b_error, binary_status, binaryExisted, idx; - cl_uint numDevices; - cl_device_id *mpArryDevsID; - FILE *fd, *fd1; - const char* filename = "kernel.cl"; - //fprintf(stderr, "[OD] CompileKernelFile ... \n"); - if ( CachedOfKernerPrg(gpuInfo, filename) == 1 ) - { - return 1; - } - - idx = gpuInfo->mnFileCount; - - source = kernel_src; - - source_size[0] = strlen( source ); - binaryExisted = 0; - binaryExisted = BinaryGenerated( filename, &fd ); // don't check for binary during microbenchmark -//PERF_COUNT_SUB("BinaryGenerated") - if ( binaryExisted == 1 ) - { - clStatus = clGetContextInfo(gpuInfo->mpContext, CL_CONTEXT_NUM_DEVICES, - sizeof(numDevices), &numDevices, nullptr); - CHECK_OPENCL(clStatus, "clGetContextInfo"); - - mpArryDevsID = (cl_device_id *)malloc(sizeof(cl_device_id) * numDevices); - if (mpArryDevsID == nullptr) { - return 0; - } -//PERF_COUNT_SUB("get numDevices") - b_error = 0; - length = 0; - b_error |= fseek( fd, 0, SEEK_END ) < 0; - b_error |= ( length = ftell(fd) ) <= 0; - b_error |= fseek( fd, 0, SEEK_SET ) < 0; - if ( b_error ) - { - return 0; - } - - binary = (char*) malloc( length + 2 ); - if ( !binary ) - { - return 0; - } - - memset( binary, 0, length + 2 ); - b_error |= fread( binary, 1, length, fd ) != length; - - - fclose( fd ); -//PERF_COUNT_SUB("read file") - fd = nullptr; - // grab the handles to all of the devices in the context. - clStatus = clGetContextInfo(gpuInfo->mpContext, CL_CONTEXT_DEVICES, - sizeof(cl_device_id) * numDevices, - mpArryDevsID, nullptr); - CHECK_OPENCL( clStatus, "clGetContextInfo" ); -//PERF_COUNT_SUB("get devices") - //fprintf(stderr, "[OD] Create kernel from binary\n"); - gpuInfo->mpArryPrograms[idx] = clCreateProgramWithBinary( gpuInfo->mpContext,numDevices, - mpArryDevsID, &length, (const unsigned char**) &binary, - &binary_status, &clStatus ); - CHECK_OPENCL( clStatus, "clCreateProgramWithBinary" ); -//PERF_COUNT_SUB("clCreateProgramWithBinary") - free( binary ); - free( mpArryDevsID ); - mpArryDevsID = nullptr; - // PERF_COUNT_SUB("binaryExisted") - } - else - { - // create a CL program using the kernel source - //fprintf(stderr, "[OD] Create kernel from source\n"); - gpuInfo->mpArryPrograms[idx] = clCreateProgramWithSource( gpuInfo->mpContext, 1, &source, - source_size, &clStatus); - CHECK_OPENCL( clStatus, "clCreateProgramWithSource" ); -//PERF_COUNT_SUB("!binaryExisted") - } - - if (gpuInfo->mpArryPrograms[idx] == (cl_program) nullptr) { - return 0; - } - - //char options[512]; - // create a cl program executable for all the devices specified - //printf("[OD] BuildProgram.\n"); -PERF_COUNT_START("OD::CompileKernel::clBuildProgram") - if (!gpuInfo->mnIsUserCreated) - { - clStatus = - clBuildProgram(gpuInfo->mpArryPrograms[idx], 1, gpuInfo->mpArryDevsID, - buildOption, nullptr, nullptr); - // PERF_COUNT_SUB("clBuildProgram notUserCreated") - } - else - { - clStatus = - clBuildProgram(gpuInfo->mpArryPrograms[idx], 1, &(gpuInfo->mpDevID), - buildOption, nullptr, nullptr); - // PERF_COUNT_SUB("clBuildProgram isUserCreated") - } -PERF_COUNT_END - if ( clStatus != CL_SUCCESS ) - { - printf ("BuildProgram error!\n"); - if ( !gpuInfo->mnIsUserCreated ) - { - clStatus = clGetProgramBuildInfo( - gpuInfo->mpArryPrograms[idx], gpuInfo->mpArryDevsID[0], - CL_PROGRAM_BUILD_LOG, 0, nullptr, &length); - } - else - { - clStatus = clGetProgramBuildInfo( - gpuInfo->mpArryPrograms[idx], gpuInfo->mpDevID, - CL_PROGRAM_BUILD_LOG, 0, nullptr, &length); - } - if ( clStatus != CL_SUCCESS ) - { - printf("opencl create build log fail\n"); - return 0; - } - buildLog = (char*) malloc( length ); - if (buildLog == (char *)nullptr) { - return 0; - } - if ( !gpuInfo->mnIsUserCreated ) - { - clStatus = clGetProgramBuildInfo( gpuInfo->mpArryPrograms[idx], gpuInfo->mpArryDevsID[0], - CL_PROGRAM_BUILD_LOG, length, buildLog, &length ); - } - else - { - clStatus = clGetProgramBuildInfo( gpuInfo->mpArryPrograms[idx], gpuInfo->mpDevID, - CL_PROGRAM_BUILD_LOG, length, buildLog, &length ); - } - if ( clStatus != CL_SUCCESS ) - { - printf("opencl program build info fail\n"); - return 0; - } - - fd1 = fopen( "kernel-build.log", "w+" ); - if (fd1 != nullptr) { - fwrite(buildLog, sizeof(char), length, fd1); - fclose(fd1); - } - - free( buildLog ); -//PERF_COUNT_SUB("build error log") - return 0; - } - - strcpy( gpuInfo->mArryKnelSrcFile[idx], filename ); -//PERF_COUNT_SUB("strcpy") - if ( binaryExisted == 0 ) { - GeneratBinFromKernelSource( gpuInfo->mpArryPrograms[idx], filename ); - PERF_COUNT_SUB("GenerateBinFromKernelSource") - } - - gpuInfo->mnFileCount += 1; -//PERF_COUNT_END - return 1; -} - -l_uint32* OpenclDevice::pixReadFromTiffKernel(l_uint32 *tiffdata,l_int32 w,l_int32 h,l_int32 wpl,l_uint32 *line) -{ -PERF_COUNT_START("pixReadFromTiffKernel") - cl_int clStatus; - KernelEnv rEnv; - size_t globalThreads[2]; - size_t localThreads[2]; - int gsize; - cl_mem valuesCl; - cl_mem outputCl; - - //global and local work dimensions for Horizontal pass - gsize = (w + GROUPSIZE_X - 1)/ GROUPSIZE_X * GROUPSIZE_X; - globalThreads[0] = gsize; - gsize = (h + GROUPSIZE_Y - 1)/ GROUPSIZE_Y * GROUPSIZE_Y; - globalThreads[1] = gsize; - localThreads[0] = GROUPSIZE_X; - localThreads[1] = GROUPSIZE_Y; - - SetKernelEnv( &rEnv ); - - l_uint32 *pResult = (l_uint32 *)malloc(w*h * sizeof(l_uint32)); - rEnv.mpkKernel = clCreateKernel( rEnv.mpkProgram, "composeRGBPixel", &clStatus ); - CHECK_OPENCL(clStatus, "clCreateKernel composeRGBPixel"); - - //Allocate input and output OCL buffers - valuesCl = allocateZeroCopyBuffer(rEnv, tiffdata, w*h, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, &clStatus); - outputCl = allocateZeroCopyBuffer(rEnv, pResult, w*h, CL_MEM_WRITE_ONLY | CL_MEM_USE_HOST_PTR, &clStatus); - - //Kernel arguments - clStatus = clSetKernelArg(rEnv.mpkKernel, 0, sizeof(cl_mem), &valuesCl); - CHECK_OPENCL( clStatus, "clSetKernelArg"); - clStatus = clSetKernelArg(rEnv.mpkKernel, 1, sizeof(w), &w); - CHECK_OPENCL( clStatus, "clSetKernelArg" ); - clStatus = clSetKernelArg(rEnv.mpkKernel, 2, sizeof(h), &h); - CHECK_OPENCL( clStatus, "clSetKernelArg" ); - clStatus = clSetKernelArg(rEnv.mpkKernel, 3, sizeof(wpl), &wpl); - CHECK_OPENCL( clStatus, "clSetKernelArg" ); - clStatus = clSetKernelArg(rEnv.mpkKernel, 4, sizeof(cl_mem), &outputCl); - CHECK_OPENCL( clStatus, "clSetKernelArg"); - - //Kernel enqueue -PERF_COUNT_SUB("before") -clStatus = - clEnqueueNDRangeKernel(rEnv.mpkCmdQueue, rEnv.mpkKernel, 2, nullptr, - globalThreads, localThreads, 0, nullptr, nullptr); -CHECK_OPENCL(clStatus, "clEnqueueNDRangeKernel"); - -/* map results back from gpu */ -void *ptr = clEnqueueMapBuffer(rEnv.mpkCmdQueue, outputCl, CL_TRUE, CL_MAP_READ, - 0, w * h * sizeof(l_uint32), 0, nullptr, nullptr, - &clStatus); -CHECK_OPENCL(clStatus, "clEnqueueMapBuffer outputCl"); -clEnqueueUnmapMemObject(rEnv.mpkCmdQueue, outputCl, ptr, 0, nullptr, nullptr); - -// Sync -clFinish(rEnv.mpkCmdQueue); -PERF_COUNT_SUB("kernel & map") -PERF_COUNT_END - return pResult; -} - -//Morphology Dilate operation for 5x5 structuring element. Invokes the relevant OpenCL kernels -static cl_int pixDilateCL_55(l_int32 wpl, l_int32 h) { - size_t globalThreads[2]; - cl_mem pixtemp; - cl_int status; - int gsize; - size_t localThreads[2]; - - // Horizontal pass - gsize = (wpl * h + GROUPSIZE_HMORX - 1) / GROUPSIZE_HMORX * GROUPSIZE_HMORX; - globalThreads[0] = gsize; - globalThreads[1] = GROUPSIZE_HMORY; - localThreads[0] = GROUPSIZE_HMORX; - localThreads[1] = GROUPSIZE_HMORY; - - rEnv.mpkKernel = - clCreateKernel(rEnv.mpkProgram, "morphoDilateHor_5x5", &status); - CHECK_OPENCL(status, "clCreateKernel morphoDilateHor_5x5"); - - status = clSetKernelArg(rEnv.mpkKernel, 0, sizeof(cl_mem), &pixsCLBuffer); - status = clSetKernelArg(rEnv.mpkKernel, 1, sizeof(cl_mem), &pixdCLBuffer); - status = clSetKernelArg(rEnv.mpkKernel, 2, sizeof(wpl), &wpl); - status = clSetKernelArg(rEnv.mpkKernel, 3, sizeof(h), &h); - - status = - clEnqueueNDRangeKernel(rEnv.mpkCmdQueue, rEnv.mpkKernel, 2, nullptr, - globalThreads, localThreads, 0, nullptr, nullptr); - - // Swap source and dest buffers - pixtemp = pixsCLBuffer; - pixsCLBuffer = pixdCLBuffer; - pixdCLBuffer = pixtemp; - - // Vertical - gsize = (wpl + GROUPSIZE_X - 1) / GROUPSIZE_X * GROUPSIZE_X; - globalThreads[0] = gsize; - gsize = (h + GROUPSIZE_Y - 1) / GROUPSIZE_Y * GROUPSIZE_Y; - globalThreads[1] = gsize; - localThreads[0] = GROUPSIZE_X; - localThreads[1] = GROUPSIZE_Y; - - rEnv.mpkKernel = - clCreateKernel(rEnv.mpkProgram, "morphoDilateVer_5x5", &status); - CHECK_OPENCL(status, "clCreateKernel morphoDilateVer_5x5"); - - status = clSetKernelArg(rEnv.mpkKernel, 0, sizeof(cl_mem), &pixsCLBuffer); - status = clSetKernelArg(rEnv.mpkKernel, 1, sizeof(cl_mem), &pixdCLBuffer); - status = clSetKernelArg(rEnv.mpkKernel, 2, sizeof(wpl), &wpl); - status = clSetKernelArg(rEnv.mpkKernel, 3, sizeof(h), &h); - status = - clEnqueueNDRangeKernel(rEnv.mpkCmdQueue, rEnv.mpkKernel, 2, nullptr, - globalThreads, localThreads, 0, nullptr, nullptr); - - return status; -} - -//Morphology Erode operation for 5x5 structuring element. Invokes the relevant OpenCL kernels -static cl_int pixErodeCL_55(l_int32 wpl, l_int32 h) { - size_t globalThreads[2]; - cl_mem pixtemp; - cl_int status; - int gsize; - l_uint32 fwmask, lwmask; - size_t localThreads[2]; - - lwmask = lmask32[31 - 2]; - fwmask = rmask32[31 - 2]; - - // Horizontal pass - gsize = (wpl * h + GROUPSIZE_HMORX - 1) / GROUPSIZE_HMORX * GROUPSIZE_HMORX; - globalThreads[0] = gsize; - globalThreads[1] = GROUPSIZE_HMORY; - localThreads[0] = GROUPSIZE_HMORX; - localThreads[1] = GROUPSIZE_HMORY; - - rEnv.mpkKernel = - clCreateKernel(rEnv.mpkProgram, "morphoErodeHor_5x5", &status); - CHECK_OPENCL(status, "clCreateKernel morphoErodeHor_5x5"); - - status = clSetKernelArg(rEnv.mpkKernel, 0, sizeof(cl_mem), &pixsCLBuffer); - status = clSetKernelArg(rEnv.mpkKernel, 1, sizeof(cl_mem), &pixdCLBuffer); - status = clSetKernelArg(rEnv.mpkKernel, 2, sizeof(wpl), &wpl); - status = clSetKernelArg(rEnv.mpkKernel, 3, sizeof(h), &h); - - status = - clEnqueueNDRangeKernel(rEnv.mpkCmdQueue, rEnv.mpkKernel, 2, nullptr, - globalThreads, localThreads, 0, nullptr, nullptr); - - // Swap source and dest buffers - pixtemp = pixsCLBuffer; - pixsCLBuffer = pixdCLBuffer; - pixdCLBuffer = pixtemp; - - // Vertical - gsize = (wpl + GROUPSIZE_X - 1) / GROUPSIZE_X * GROUPSIZE_X; - globalThreads[0] = gsize; - gsize = (h + GROUPSIZE_Y - 1) / GROUPSIZE_Y * GROUPSIZE_Y; - globalThreads[1] = gsize; - localThreads[0] = GROUPSIZE_X; - localThreads[1] = GROUPSIZE_Y; - - rEnv.mpkKernel = - clCreateKernel(rEnv.mpkProgram, "morphoErodeVer_5x5", &status); - CHECK_OPENCL(status, "clCreateKernel morphoErodeVer_5x5"); - - status = clSetKernelArg(rEnv.mpkKernel, 0, sizeof(cl_mem), &pixsCLBuffer); - status = clSetKernelArg(rEnv.mpkKernel, 1, sizeof(cl_mem), &pixdCLBuffer); - status = clSetKernelArg(rEnv.mpkKernel, 2, sizeof(wpl), &wpl); - status = clSetKernelArg(rEnv.mpkKernel, 3, sizeof(h), &h); - status = clSetKernelArg(rEnv.mpkKernel, 4, sizeof(fwmask), &fwmask); - status = clSetKernelArg(rEnv.mpkKernel, 5, sizeof(lwmask), &lwmask); - status = - clEnqueueNDRangeKernel(rEnv.mpkCmdQueue, rEnv.mpkKernel, 2, nullptr, - globalThreads, localThreads, 0, nullptr, nullptr); - - return status; -} - -//Morphology Dilate operation. Invokes the relevant OpenCL kernels -static cl_int pixDilateCL(l_int32 hsize, l_int32 vsize, l_int32 wpl, - l_int32 h) { - l_int32 xp, yp, xn, yn; - SEL *sel; - size_t globalThreads[2]; - cl_mem pixtemp; - cl_int status; - int gsize; - size_t localThreads[2]; - char isEven; - - OpenclDevice::SetKernelEnv(&rEnv); - - if (hsize == 5 && vsize == 5) { - // Specific case for 5x5 - status = pixDilateCL_55(wpl, h); - return status; - } - - sel = selCreateBrick(vsize, hsize, vsize / 2, hsize / 2, SEL_HIT); - - selFindMaxTranslations(sel, &xp, &yp, &xn, &yn); - selDestroy(&sel); - // global and local work dimensions for Horizontal pass - gsize = (wpl + GROUPSIZE_X - 1) / GROUPSIZE_X * GROUPSIZE_X; - globalThreads[0] = gsize; - gsize = (h + GROUPSIZE_Y - 1) / GROUPSIZE_Y * GROUPSIZE_Y; - globalThreads[1] = gsize; - localThreads[0] = GROUPSIZE_X; - localThreads[1] = GROUPSIZE_Y; - - if (xp > 31 || xn > 31) { - // Generic case. - rEnv.mpkKernel = - clCreateKernel(rEnv.mpkProgram, "morphoDilateHor", &status); - CHECK_OPENCL(status, "clCreateKernel morphoDilateHor"); - - status = clSetKernelArg(rEnv.mpkKernel, 0, sizeof(cl_mem), &pixsCLBuffer); - status = clSetKernelArg(rEnv.mpkKernel, 1, sizeof(cl_mem), &pixdCLBuffer); - status = clSetKernelArg(rEnv.mpkKernel, 2, sizeof(xp), &xp); - status = clSetKernelArg(rEnv.mpkKernel, 3, sizeof(xn), &xn); - status = clSetKernelArg(rEnv.mpkKernel, 4, sizeof(wpl), &wpl); - status = clSetKernelArg(rEnv.mpkKernel, 5, sizeof(h), &h); - status = clEnqueueNDRangeKernel(rEnv.mpkCmdQueue, rEnv.mpkKernel, 2, - nullptr, globalThreads, localThreads, 0, - nullptr, nullptr); - - if (yp > 0 || yn > 0) { - pixtemp = pixsCLBuffer; - pixsCLBuffer = pixdCLBuffer; - pixdCLBuffer = pixtemp; - } - } else if (xp > 0 || xn > 0) { - // Specific Horizontal pass kernel for half width < 32 - rEnv.mpkKernel = - clCreateKernel(rEnv.mpkProgram, "morphoDilateHor_32word", &status); - CHECK_OPENCL(status, "clCreateKernel morphoDilateHor_32word"); - isEven = (xp != xn); - - status = clSetKernelArg(rEnv.mpkKernel, 0, sizeof(cl_mem), &pixsCLBuffer); - status = clSetKernelArg(rEnv.mpkKernel, 1, sizeof(cl_mem), &pixdCLBuffer); - status = clSetKernelArg(rEnv.mpkKernel, 2, sizeof(xp), &xp); - status = clSetKernelArg(rEnv.mpkKernel, 3, sizeof(wpl), &wpl); - status = clSetKernelArg(rEnv.mpkKernel, 4, sizeof(h), &h); - status = clSetKernelArg(rEnv.mpkKernel, 5, sizeof(isEven), &isEven); - status = clEnqueueNDRangeKernel(rEnv.mpkCmdQueue, rEnv.mpkKernel, 2, - nullptr, globalThreads, localThreads, 0, - nullptr, nullptr); - - if (yp > 0 || yn > 0) { - pixtemp = pixsCLBuffer; - pixsCLBuffer = pixdCLBuffer; - pixdCLBuffer = pixtemp; - } - } - - if (yp > 0 || yn > 0) { - rEnv.mpkKernel = - clCreateKernel(rEnv.mpkProgram, "morphoDilateVer", &status); - CHECK_OPENCL(status, "clCreateKernel morphoDilateVer"); - - status = clSetKernelArg(rEnv.mpkKernel, 0, sizeof(cl_mem), &pixsCLBuffer); - status = clSetKernelArg(rEnv.mpkKernel, 1, sizeof(cl_mem), &pixdCLBuffer); - status = clSetKernelArg(rEnv.mpkKernel, 2, sizeof(yp), &yp); - status = clSetKernelArg(rEnv.mpkKernel, 3, sizeof(wpl), &wpl); - status = clSetKernelArg(rEnv.mpkKernel, 4, sizeof(h), &h); - status = clSetKernelArg(rEnv.mpkKernel, 5, sizeof(yn), &yn); - status = clEnqueueNDRangeKernel(rEnv.mpkCmdQueue, rEnv.mpkKernel, 2, - nullptr, globalThreads, localThreads, 0, - nullptr, nullptr); - } - - return status; -} - -//Morphology Erode operation. Invokes the relevant OpenCL kernels -static cl_int pixErodeCL(l_int32 hsize, l_int32 vsize, l_uint32 wpl, - l_uint32 h) { - l_int32 xp, yp, xn, yn; - SEL *sel; - size_t globalThreads[2]; - size_t localThreads[2]; - cl_mem pixtemp; - cl_int status; - int gsize; - char isAsymmetric = (MORPH_BC == ASYMMETRIC_MORPH_BC); - l_uint32 rwmask, lwmask; - char isEven; - - sel = selCreateBrick(vsize, hsize, vsize / 2, hsize / 2, SEL_HIT); - - selFindMaxTranslations(sel, &xp, &yp, &xn, &yn); - selDestroy(&sel); - OpenclDevice::SetKernelEnv(&rEnv); - - if (hsize == 5 && vsize == 5 && isAsymmetric) { - // Specific kernel for 5x5 - status = pixErodeCL_55(wpl, h); - return status; - } - - lwmask = lmask32[31 - (xn & 31)]; - rwmask = rmask32[31 - (xp & 31)]; - - // global and local work dimensions for Horizontal pass - gsize = (wpl + GROUPSIZE_X - 1) / GROUPSIZE_X * GROUPSIZE_X; - globalThreads[0] = gsize; - gsize = (h + GROUPSIZE_Y - 1) / GROUPSIZE_Y * GROUPSIZE_Y; - globalThreads[1] = gsize; - localThreads[0] = GROUPSIZE_X; - localThreads[1] = GROUPSIZE_Y; - - // Horizontal Pass - if (xp > 31 || xn > 31) { - // Generic case. - rEnv.mpkKernel = clCreateKernel(rEnv.mpkProgram, "morphoErodeHor", &status); - - status = clSetKernelArg(rEnv.mpkKernel, 0, sizeof(cl_mem), &pixsCLBuffer); - status = clSetKernelArg(rEnv.mpkKernel, 1, sizeof(cl_mem), &pixdCLBuffer); - status = clSetKernelArg(rEnv.mpkKernel, 2, sizeof(xp), &xp); - status = clSetKernelArg(rEnv.mpkKernel, 3, sizeof(xn), &xn); - status = clSetKernelArg(rEnv.mpkKernel, 4, sizeof(wpl), &wpl); - status = clSetKernelArg(rEnv.mpkKernel, 5, sizeof(h), &h); - status = - clSetKernelArg(rEnv.mpkKernel, 6, sizeof(isAsymmetric), &isAsymmetric); - status = clSetKernelArg(rEnv.mpkKernel, 7, sizeof(rwmask), &rwmask); - status = clSetKernelArg(rEnv.mpkKernel, 8, sizeof(lwmask), &lwmask); - status = clEnqueueNDRangeKernel(rEnv.mpkCmdQueue, rEnv.mpkKernel, 2, - nullptr, globalThreads, localThreads, 0, - nullptr, nullptr); - - if (yp > 0 || yn > 0) { - pixtemp = pixsCLBuffer; - pixsCLBuffer = pixdCLBuffer; - pixdCLBuffer = pixtemp; - } - } else if (xp > 0 || xn > 0) { - rEnv.mpkKernel = - clCreateKernel(rEnv.mpkProgram, "morphoErodeHor_32word", &status); - isEven = (xp != xn); - - status = clSetKernelArg(rEnv.mpkKernel, 0, sizeof(cl_mem), &pixsCLBuffer); - status = clSetKernelArg(rEnv.mpkKernel, 1, sizeof(cl_mem), &pixdCLBuffer); - status = clSetKernelArg(rEnv.mpkKernel, 2, sizeof(xp), &xp); - status = clSetKernelArg(rEnv.mpkKernel, 3, sizeof(wpl), &wpl); - status = clSetKernelArg(rEnv.mpkKernel, 4, sizeof(h), &h); - status = - clSetKernelArg(rEnv.mpkKernel, 5, sizeof(isAsymmetric), &isAsymmetric); - status = clSetKernelArg(rEnv.mpkKernel, 6, sizeof(rwmask), &rwmask); - status = clSetKernelArg(rEnv.mpkKernel, 7, sizeof(lwmask), &lwmask); - status = clSetKernelArg(rEnv.mpkKernel, 8, sizeof(isEven), &isEven); - status = clEnqueueNDRangeKernel(rEnv.mpkCmdQueue, rEnv.mpkKernel, 2, - nullptr, globalThreads, localThreads, 0, - nullptr, nullptr); - - if (yp > 0 || yn > 0) { - pixtemp = pixsCLBuffer; - pixsCLBuffer = pixdCLBuffer; - pixdCLBuffer = pixtemp; - } - } - - // Vertical Pass - if (yp > 0 || yn > 0) { - rEnv.mpkKernel = clCreateKernel(rEnv.mpkProgram, "morphoErodeVer", &status); - CHECK_OPENCL(status, "clCreateKernel morphoErodeVer"); - - status = clSetKernelArg(rEnv.mpkKernel, 0, sizeof(cl_mem), &pixsCLBuffer); - status = clSetKernelArg(rEnv.mpkKernel, 1, sizeof(cl_mem), &pixdCLBuffer); - status = clSetKernelArg(rEnv.mpkKernel, 2, sizeof(yp), &yp); - status = clSetKernelArg(rEnv.mpkKernel, 3, sizeof(wpl), &wpl); - status = clSetKernelArg(rEnv.mpkKernel, 4, sizeof(h), &h); - status = - clSetKernelArg(rEnv.mpkKernel, 5, sizeof(isAsymmetric), &isAsymmetric); - status = clSetKernelArg(rEnv.mpkKernel, 6, sizeof(yn), &yn); - status = clEnqueueNDRangeKernel(rEnv.mpkCmdQueue, rEnv.mpkKernel, 2, - nullptr, globalThreads, localThreads, 0, - nullptr, nullptr); - } - - return status; -} - -//Morphology Open operation. Invokes the relevant OpenCL kernels -static cl_int pixOpenCL(l_int32 hsize, l_int32 vsize, l_int32 wpl, l_int32 h) { - cl_int status; - cl_mem pixtemp; - - // Erode followed by Dilate - status = pixErodeCL(hsize, vsize, wpl, h); - - pixtemp = pixsCLBuffer; - pixsCLBuffer = pixdCLBuffer; - pixdCLBuffer = pixtemp; - - status = pixDilateCL(hsize, vsize, wpl, h); - - return status; -} - -//Morphology Close operation. Invokes the relevant OpenCL kernels -static cl_int pixCloseCL(l_int32 hsize, l_int32 vsize, l_int32 wpl, l_int32 h) { - cl_int status; - cl_mem pixtemp; - - // Dilate followed by Erode - status = pixDilateCL(hsize, vsize, wpl, h); - - pixtemp = pixsCLBuffer; - pixsCLBuffer = pixdCLBuffer; - pixdCLBuffer = pixtemp; - - status = pixErodeCL(hsize, vsize, wpl, h); - - return status; -} - -//output = buffer1 & ~(buffer2) -static cl_int pixSubtractCL_work(l_uint32 wpl, l_uint32 h, cl_mem buffer1, - cl_mem buffer2, cl_mem outBuffer = nullptr) { - cl_int status; - size_t globalThreads[2]; - int gsize; - size_t localThreads[] = {GROUPSIZE_X, GROUPSIZE_Y}; - - gsize = (wpl + GROUPSIZE_X - 1) / GROUPSIZE_X * GROUPSIZE_X; - globalThreads[0] = gsize; - gsize = (h + GROUPSIZE_Y - 1) / GROUPSIZE_Y * GROUPSIZE_Y; - globalThreads[1] = gsize; - - if (outBuffer != nullptr) { - rEnv.mpkKernel = clCreateKernel(rEnv.mpkProgram, "pixSubtract", &status); - CHECK_OPENCL(status, "clCreateKernel pixSubtract"); - } else { - rEnv.mpkKernel = - clCreateKernel(rEnv.mpkProgram, "pixSubtract_inplace", &status); - CHECK_OPENCL(status, "clCreateKernel pixSubtract_inplace"); - } - - // Enqueue a kernel run call. - status = clSetKernelArg(rEnv.mpkKernel, 0, sizeof(cl_mem), &buffer1); - status = clSetKernelArg(rEnv.mpkKernel, 1, sizeof(cl_mem), &buffer2); - status = clSetKernelArg(rEnv.mpkKernel, 2, sizeof(wpl), &wpl); - status = clSetKernelArg(rEnv.mpkKernel, 3, sizeof(h), &h); - if (outBuffer != nullptr) { - status = clSetKernelArg(rEnv.mpkKernel, 4, sizeof(cl_mem), &outBuffer); - } - status = - clEnqueueNDRangeKernel(rEnv.mpkCmdQueue, rEnv.mpkKernel, 2, nullptr, - globalThreads, localThreads, 0, nullptr, nullptr); - - return status; -} - -// OpenCL implementation of Get Lines from pix function -//Note: Assumes the source and dest opencl buffer are initialized. No check done -void OpenclDevice::pixGetLinesCL(Pix *pixd, Pix *pixs, Pix **pix_vline, - Pix **pix_hline, Pix **pixClosed, - bool getpixClosed, l_int32 close_hsize, - l_int32 close_vsize, l_int32 open_hsize, - l_int32 open_vsize, l_int32 line_hsize, - l_int32 line_vsize) { - l_uint32 wpl, h; - cl_mem pixtemp; - - wpl = pixGetWpl(pixs); - h = pixGetHeight(pixs); - - // First step : Close Morph operation: Dilate followed by Erode - clStatus = pixCloseCL(close_hsize, close_vsize, wpl, h); - - // Copy the Close output to CPU buffer - if (getpixClosed) { - *pixClosed = mapOutputCLBuffer(rEnv, pixdCLBuffer, *pixClosed, pixs, - wpl * h, CL_MAP_READ, true, false); - } - - // Store the output of close operation in an intermediate buffer - // this will be later used for pixsubtract - clStatus = - clEnqueueCopyBuffer(rEnv.mpkCmdQueue, pixdCLBuffer, pixdCLIntermediate, 0, - 0, sizeof(int) * wpl * h, 0, nullptr, nullptr); - - // Second step: Open Operation - Erode followed by Dilate - pixtemp = pixsCLBuffer; - pixsCLBuffer = pixdCLBuffer; - pixdCLBuffer = pixtemp; - - clStatus = pixOpenCL(open_hsize, open_vsize, wpl, h); - - // Third step: Subtract : (Close - Open) - pixtemp = pixsCLBuffer; - pixsCLBuffer = pixdCLBuffer; - pixdCLBuffer = pixdCLIntermediate; - pixdCLIntermediate = pixtemp; - - clStatus = pixSubtractCL_work(wpl, h, pixdCLBuffer, pixsCLBuffer); - - // Store the output of Hollow operation in an intermediate buffer - // this will be later used - clStatus = - clEnqueueCopyBuffer(rEnv.mpkCmdQueue, pixdCLBuffer, pixdCLIntermediate, 0, - 0, sizeof(int) * wpl * h, 0, nullptr, nullptr); - - pixtemp = pixsCLBuffer; - pixsCLBuffer = pixdCLBuffer; - pixdCLBuffer = pixtemp; - - // Fourth step: Get vertical line - // pixOpenBrick(nullptr, pix_hollow, 1, min_line_length); - clStatus = pixOpenCL(1, line_vsize, wpl, h); - - // Copy the vertical line output to CPU buffer - *pix_vline = mapOutputCLBuffer(rEnv, pixdCLBuffer, *pix_vline, pixs, wpl * h, - CL_MAP_READ, true, false); - - pixtemp = pixsCLBuffer; - pixsCLBuffer = pixdCLIntermediate; - pixdCLIntermediate = pixtemp; - - // Fifth step: Get horizontal line - // pixOpenBrick(nullptr, pix_hollow, min_line_length, 1); - clStatus = pixOpenCL(line_hsize, 1, wpl, h); - - // Copy the horizontal line output to CPU buffer - *pix_hline = mapOutputCLBuffer(rEnv, pixdCLBuffer, *pix_hline, pixs, wpl * h, - CL_MAP_READ, true, true); - - return; -} - -/************************************************************************* - * HistogramRect - * Otsu Thresholding Operations - * histogramAllChannels is laid out as all channel 0, then all channel 1... - * only supports 1 or 4 channels (bytes_per_pixel) - ************************************************************************/ -int OpenclDevice::HistogramRectOCL(unsigned char *imageData, - int bytes_per_pixel, int bytes_per_line, - int left, // always 0 - int top, // always 0 - int width, int height, int kHistogramSize, - int *histogramAllChannels) { - PERF_COUNT_START("HistogramRectOCL") - cl_int clStatus; - int retVal = 0; - KernelEnv histKern; - SetKernelEnv(&histKern); - KernelEnv histRedKern; - SetKernelEnv(&histRedKern); - /* map imagedata to device as read only */ - // USE_HOST_PTR uses onion+ bus which is slowest option; also happens to be - // coherent which we don't need. - // faster option would be to allocate initial image buffer - // using a garlic bus memory type - cl_mem imageBuffer = clCreateBuffer( - histKern.mpkContext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, - width * height * bytes_per_pixel * sizeof(char), imageData, &clStatus); - CHECK_OPENCL(clStatus, "clCreateBuffer imageBuffer"); - - /* setup work group size parameters */ - int block_size = 256; - cl_uint numCUs; - clStatus = clGetDeviceInfo(gpuEnv.mpDevID, CL_DEVICE_MAX_COMPUTE_UNITS, - sizeof(numCUs), &numCUs, nullptr); - CHECK_OPENCL(clStatus, "clCreateBuffer imageBuffer"); - - int requestedOccupancy = 10; - int numWorkGroups = numCUs * requestedOccupancy; - int numThreads = block_size * numWorkGroups; - size_t local_work_size[] = {static_cast(block_size)}; - size_t global_work_size[] = {static_cast(numThreads)}; - size_t red_global_work_size[] = { - static_cast(block_size * kHistogramSize * bytes_per_pixel)}; - - /* map histogramAllChannels as write only */ - - cl_mem histogramBuffer = clCreateBuffer( - histKern.mpkContext, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, - kHistogramSize * bytes_per_pixel * sizeof(int), histogramAllChannels, - &clStatus); - CHECK_OPENCL(clStatus, "clCreateBuffer histogramBuffer"); - - /* intermediate histogram buffer */ - int histRed = 256; - int tmpHistogramBins = kHistogramSize * bytes_per_pixel * histRed; - - cl_mem tmpHistogramBuffer = - clCreateBuffer(histKern.mpkContext, CL_MEM_READ_WRITE, - tmpHistogramBins * sizeof(cl_uint), nullptr, &clStatus); - CHECK_OPENCL(clStatus, "clCreateBuffer tmpHistogramBuffer"); - - /* atomic sync buffer */ - int *zeroBuffer = new int[1]; - zeroBuffer[0] = 0; - cl_mem atomicSyncBuffer = clCreateBuffer( - histKern.mpkContext, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, - sizeof(cl_int), zeroBuffer, &clStatus); - CHECK_OPENCL(clStatus, "clCreateBuffer atomicSyncBuffer"); - delete[] zeroBuffer; - // Create kernel objects based on bytes_per_pixel - if (bytes_per_pixel == 1) { - histKern.mpkKernel = clCreateKernel( - histKern.mpkProgram, "kernel_HistogramRectOneChannel", &clStatus); - CHECK_OPENCL(clStatus, "clCreateKernel kernel_HistogramRectOneChannel"); - - histRedKern.mpkKernel = - clCreateKernel(histRedKern.mpkProgram, - "kernel_HistogramRectOneChannelReduction", &clStatus); - CHECK_OPENCL(clStatus, - "clCreateKernel kernel_HistogramRectOneChannelReduction"); - } else { - histKern.mpkKernel = clCreateKernel( histKern.mpkProgram, "kernel_HistogramRectAllChannels", &clStatus ); - CHECK_OPENCL( clStatus, "clCreateKernel kernel_HistogramRectAllChannels"); - - histRedKern.mpkKernel = clCreateKernel( histRedKern.mpkProgram, "kernel_HistogramRectAllChannelsReduction", &clStatus ); - CHECK_OPENCL( clStatus, "clCreateKernel kernel_HistogramRectAllChannelsReduction"); - } - - void *ptr; - - //Initialize tmpHistogramBuffer buffer - ptr = clEnqueueMapBuffer( - histKern.mpkCmdQueue, tmpHistogramBuffer, CL_TRUE, CL_MAP_WRITE, 0, - tmpHistogramBins * sizeof(cl_uint), 0, nullptr, nullptr, &clStatus); - CHECK_OPENCL( clStatus, "clEnqueueMapBuffer tmpHistogramBuffer"); - - memset(ptr, 0, tmpHistogramBins*sizeof(cl_uint)); - clEnqueueUnmapMemObject(histKern.mpkCmdQueue, tmpHistogramBuffer, ptr, 0, - nullptr, nullptr); - - /* set kernel 1 arguments */ - clStatus = - clSetKernelArg(histKern.mpkKernel, 0, sizeof(cl_mem), &imageBuffer); - CHECK_OPENCL( clStatus, "clSetKernelArg imageBuffer"); - cl_uint numPixels = width*height; - clStatus = - clSetKernelArg(histKern.mpkKernel, 1, sizeof(cl_uint), &numPixels); - CHECK_OPENCL( clStatus, "clSetKernelArg numPixels" ); - clStatus = clSetKernelArg(histKern.mpkKernel, 2, sizeof(cl_mem), - &tmpHistogramBuffer); - CHECK_OPENCL( clStatus, "clSetKernelArg tmpHistogramBuffer"); - - /* set kernel 2 arguments */ - int n = numThreads/bytes_per_pixel; - clStatus = clSetKernelArg(histRedKern.mpkKernel, 0, sizeof(cl_int), &n); - CHECK_OPENCL( clStatus, "clSetKernelArg imageBuffer"); - clStatus = clSetKernelArg(histRedKern.mpkKernel, 1, sizeof(cl_mem), - &tmpHistogramBuffer); - CHECK_OPENCL( clStatus, "clSetKernelArg tmpHistogramBuffer"); - clStatus = clSetKernelArg(histRedKern.mpkKernel, 2, sizeof(cl_mem), - &histogramBuffer); - CHECK_OPENCL( clStatus, "clSetKernelArg histogramBuffer"); - - /* launch histogram */ -PERF_COUNT_SUB("before") -clStatus = clEnqueueNDRangeKernel(histKern.mpkCmdQueue, histKern.mpkKernel, 1, - nullptr, global_work_size, local_work_size, 0, - nullptr, nullptr); -CHECK_OPENCL(clStatus, - "clEnqueueNDRangeKernel kernel_HistogramRectAllChannels"); -clFinish(histKern.mpkCmdQueue); -if (clStatus != 0) { - retVal = -1; - } - /* launch histogram */ - clStatus = clEnqueueNDRangeKernel( - histRedKern.mpkCmdQueue, histRedKern.mpkKernel, 1, nullptr, - red_global_work_size, local_work_size, 0, nullptr, nullptr); - CHECK_OPENCL( clStatus, "clEnqueueNDRangeKernel kernel_HistogramRectAllChannelsReduction" ); - clFinish( histRedKern.mpkCmdQueue ); - if (clStatus != 0) { - retVal = -1; - } - PERF_COUNT_SUB("redKernel") - - /* map results back from gpu */ - ptr = clEnqueueMapBuffer(histRedKern.mpkCmdQueue, histogramBuffer, CL_TRUE, - CL_MAP_READ, 0, - kHistogramSize * bytes_per_pixel * sizeof(int), 0, - nullptr, nullptr, &clStatus); - CHECK_OPENCL( clStatus, "clEnqueueMapBuffer histogramBuffer"); - if (clStatus != 0) { - retVal = -1; - } - clEnqueueUnmapMemObject(histRedKern.mpkCmdQueue, histogramBuffer, ptr, 0, - nullptr, nullptr); - - clReleaseMemObject(histogramBuffer); - clReleaseMemObject(imageBuffer); -PERF_COUNT_SUB("after") -PERF_COUNT_END -return retVal; -} - -/************************************************************************* - * Threshold the rectangle, taking everything except the image buffer pointer - * from the class, using thresholds/hi_values to the output IMAGE. - * only supports 1 or 4 channels - ************************************************************************/ -int OpenclDevice::ThresholdRectToPixOCL(unsigned char *imageData, - int bytes_per_pixel, int bytes_per_line, - int *thresholds, int *hi_values, - Pix **pix, int height, int width, - int top, int left) { - PERF_COUNT_START("ThresholdRectToPixOCL") - int retVal = 0; - /* create pix result buffer */ - *pix = pixCreate(width, height, 1); - uint32_t *pixData = pixGetData(*pix); - int wpl = pixGetWpl(*pix); - int pixSize = wpl * height * sizeof(uint32_t); // number of pixels - - cl_int clStatus; - KernelEnv rEnv; - SetKernelEnv(&rEnv); - - /* setup work group size parameters */ - int block_size = 256; - cl_uint numCUs = 6; - clStatus = clGetDeviceInfo(gpuEnv.mpDevID, CL_DEVICE_MAX_COMPUTE_UNITS, - sizeof(numCUs), &numCUs, nullptr); - CHECK_OPENCL(clStatus, "clCreateBuffer imageBuffer"); - - int requestedOccupancy = 10; - int numWorkGroups = numCUs * requestedOccupancy; - int numThreads = block_size * numWorkGroups; - size_t local_work_size[] = {(size_t)block_size}; - size_t global_work_size[] = {(size_t)numThreads}; - - /* map imagedata to device as read only */ - // USE_HOST_PTR uses onion+ bus which is slowest option; also happens to be - // coherent which we don't need. - // faster option would be to allocate initial image buffer - // using a garlic bus memory type - cl_mem imageBuffer = clCreateBuffer( - rEnv.mpkContext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, - width * height * bytes_per_pixel * sizeof(char), imageData, &clStatus); - CHECK_OPENCL(clStatus, "clCreateBuffer imageBuffer"); - - /* map pix as write only */ - pixThBuffer = - clCreateBuffer(rEnv.mpkContext, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, - pixSize, pixData, &clStatus); - CHECK_OPENCL(clStatus, "clCreateBuffer pix"); - - /* map thresholds and hi_values */ - cl_mem thresholdsBuffer = - clCreateBuffer(rEnv.mpkContext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, - bytes_per_pixel * sizeof(int), thresholds, &clStatus); - CHECK_OPENCL(clStatus, "clCreateBuffer thresholdBuffer"); - cl_mem hiValuesBuffer = - clCreateBuffer(rEnv.mpkContext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, - bytes_per_pixel * sizeof(int), hi_values, &clStatus); - CHECK_OPENCL(clStatus, "clCreateBuffer hiValuesBuffer"); - - /* compile kernel */ - if (bytes_per_pixel == 4) { - rEnv.mpkKernel = - clCreateKernel(rEnv.mpkProgram, "kernel_ThresholdRectToPix", &clStatus); - CHECK_OPENCL(clStatus, "clCreateKernel kernel_ThresholdRectToPix"); - } else { - rEnv.mpkKernel = clCreateKernel( - rEnv.mpkProgram, "kernel_ThresholdRectToPix_OneChan", &clStatus); - CHECK_OPENCL(clStatus, "clCreateKernel kernel_ThresholdRectToPix_OneChan"); - } - - /* set kernel arguments */ - clStatus = clSetKernelArg(rEnv.mpkKernel, 0, sizeof(cl_mem), &imageBuffer); - CHECK_OPENCL(clStatus, "clSetKernelArg imageBuffer"); - clStatus = clSetKernelArg(rEnv.mpkKernel, 1, sizeof(int), &height); - CHECK_OPENCL(clStatus, "clSetKernelArg height"); - clStatus = clSetKernelArg(rEnv.mpkKernel, 2, sizeof(int), &width); - CHECK_OPENCL(clStatus, "clSetKernelArg width"); - clStatus = clSetKernelArg(rEnv.mpkKernel, 3, sizeof(int), &wpl); - CHECK_OPENCL(clStatus, "clSetKernelArg wpl"); - clStatus = - clSetKernelArg(rEnv.mpkKernel, 4, sizeof(cl_mem), &thresholdsBuffer); - CHECK_OPENCL(clStatus, "clSetKernelArg thresholdsBuffer"); - clStatus = clSetKernelArg(rEnv.mpkKernel, 5, sizeof(cl_mem), &hiValuesBuffer); - CHECK_OPENCL(clStatus, "clSetKernelArg hiValuesBuffer"); - clStatus = clSetKernelArg(rEnv.mpkKernel, 6, sizeof(cl_mem), &pixThBuffer); - CHECK_OPENCL(clStatus, "clSetKernelArg pixThBuffer"); - - /* launch kernel & wait */ - PERF_COUNT_SUB("before") - clStatus = clEnqueueNDRangeKernel(rEnv.mpkCmdQueue, rEnv.mpkKernel, 1, - nullptr, global_work_size, local_work_size, - 0, nullptr, nullptr); - CHECK_OPENCL(clStatus, "clEnqueueNDRangeKernel kernel_ThresholdRectToPix"); - clFinish(rEnv.mpkCmdQueue); - PERF_COUNT_SUB("kernel") - if (clStatus != 0) { - printf("Setting return value to -1\n"); - retVal = -1; - } - /* map results back from gpu */ - void *ptr = - clEnqueueMapBuffer(rEnv.mpkCmdQueue, pixThBuffer, CL_TRUE, CL_MAP_READ, 0, - pixSize, 0, nullptr, nullptr, &clStatus); - CHECK_OPENCL(clStatus, "clEnqueueMapBuffer histogramBuffer"); - clEnqueueUnmapMemObject(rEnv.mpkCmdQueue, pixThBuffer, ptr, 0, nullptr, - nullptr); - - clReleaseMemObject(imageBuffer); - clReleaseMemObject(thresholdsBuffer); - clReleaseMemObject(hiValuesBuffer); - - PERF_COUNT_SUB("after") - PERF_COUNT_END - return retVal; -} - - - -/****************************************************************************** - * Data Types for Device Selection - *****************************************************************************/ - -typedef struct _TessScoreEvaluationInputData { - int height; - int width; - int numChannels; - unsigned char *imageData; - Pix *pix; -} TessScoreEvaluationInputData; - -static void populateTessScoreEvaluationInputData( - TessScoreEvaluationInputData *input) { - srand(1); - // 8.5x11 inches @ 300dpi rounded to clean multiples - int height = 3328; // %256 - int width = 2560; // %512 - int numChannels = 4; - input->height = height; - input->width = width; - input->numChannels = numChannels; - unsigned char(*imageData4)[4] = (unsigned char(*)[4])malloc( - height * width * numChannels * - sizeof(unsigned char)); // new unsigned char[4][height*width]; - input->imageData = (unsigned char *)&imageData4[0]; - - // zero out image - unsigned char pixelWhite[4] = {0, 0, 0, 255}; - unsigned char pixelBlack[4] = {255, 255, 255, 255}; - for (int p = 0; p < height * width; p++) { - // unsigned char tmp[4] = imageData4[0]; - imageData4[p][0] = pixelWhite[0]; - imageData4[p][1] = pixelWhite[1]; - imageData4[p][2] = pixelWhite[2]; - imageData4[p][3] = pixelWhite[3]; - } - // random lines to be eliminated - int maxLineWidth = 64; // pixels wide - int numLines = 10; - // vertical lines - for (int i = 0; i < numLines; i++) { - int lineWidth = rand() % maxLineWidth; - int vertLinePos = lineWidth + rand() % (width - 2 * lineWidth); - // printf("[PI] VerticalLine @ %i (w=%i)\n", vertLinePos, lineWidth); - for (int row = vertLinePos - lineWidth / 2; - row < vertLinePos + lineWidth / 2; row++) { - for (int col = 0; col < height; col++) { - // imageData4[row*width+col] = pixelBlack; - imageData4[row * width + col][0] = pixelBlack[0]; - imageData4[row * width + col][1] = pixelBlack[1]; - imageData4[row * width + col][2] = pixelBlack[2]; - imageData4[row * width + col][3] = pixelBlack[3]; - } - } - } - // horizontal lines - for (int i = 0; i < numLines; i++) { - int lineWidth = rand() % maxLineWidth; - int horLinePos = lineWidth + rand() % (height - 2 * lineWidth); - // printf("[PI] HorizontalLine @ %i (w=%i)\n", horLinePos, lineWidth); - for (int row = 0; row < width; row++) { - for (int col = horLinePos - lineWidth / 2; - col < horLinePos + lineWidth / 2; - col++) { // for (int row = vertLinePos-lineWidth/2; row < - // vertLinePos+lineWidth/2; row++) { - // printf("[PI] HoizLine pix @ (%3i, %3i)\n", row, col); - // imageData4[row*width+col] = pixelBlack; - imageData4[row * width + col][0] = pixelBlack[0]; - imageData4[row * width + col][1] = pixelBlack[1]; - imageData4[row * width + col][2] = pixelBlack[2]; - imageData4[row * width + col][3] = pixelBlack[3]; - } - } - } - // spots (noise, squares) - float fractionBlack = 0.1; // how much of the image should be blackened - int numSpots = - (height * width) * fractionBlack / (maxLineWidth * maxLineWidth / 2 / 2); - for (int i = 0; i < numSpots; i++) { - int lineWidth = rand() % maxLineWidth; - int col = lineWidth + rand() % (width - 2 * lineWidth); - int row = lineWidth + rand() % (height - 2 * lineWidth); - // printf("[PI] Spot[%i/%i] @ (%3i, %3i)\n", i, numSpots, row, col ); - for (int r = row - lineWidth / 2; r < row + lineWidth / 2; r++) { - for (int c = col - lineWidth / 2; c < col + lineWidth / 2; c++) { - // printf("[PI] \tSpot[%i/%i] @ (%3i, %3i)\n", i, numSpots, r, c ); - // imageData4[row*width+col] = pixelBlack; - imageData4[r * width + c][0] = pixelBlack[0]; - imageData4[r * width + c][1] = pixelBlack[1]; - imageData4[r * width + c][2] = pixelBlack[2]; - imageData4[r * width + c][3] = pixelBlack[3]; - } - } - } - - input->pix = pixCreate(input->width, input->height, 1); -} - -typedef struct _TessDeviceScore { - float time; // small time means faster device - bool clError; // were there any opencl errors - bool valid; // was the correct response generated -} TessDeviceScore; - -/****************************************************************************** - * Micro Benchmarks for Device Selection - *****************************************************************************/ - -static double composeRGBPixelMicroBench(GPUEnv *env, - TessScoreEvaluationInputData input, - ds_device_type type) { - double time = 0; -#if ON_WINDOWS - LARGE_INTEGER freq, time_funct_start, time_funct_end; - QueryPerformanceFrequency(&freq); -#elif ON_APPLE - mach_timebase_info_data_t info = {0, 0}; - mach_timebase_info(&info); - long long start, stop; -#else - timespec time_funct_start, time_funct_end; -#endif - // input data - l_uint32 *tiffdata = (l_uint32 *)input.imageData;// same size and random data; data doesn't change workload - - // function call - if (type == DS_DEVICE_OPENCL_DEVICE) { -#if ON_WINDOWS - QueryPerformanceCounter(&time_funct_start); -#elif ON_APPLE - start = mach_absolute_time(); -#else - clock_gettime( CLOCK_MONOTONIC, &time_funct_start ); -#endif - - OpenclDevice::gpuEnv = *env; - int wpl = pixGetWpl(input.pix); - OpenclDevice::pixReadFromTiffKernel(tiffdata, input.width, input.height, - wpl, nullptr); -#if ON_WINDOWS - QueryPerformanceCounter(&time_funct_end); - time = (time_funct_end.QuadPart-time_funct_start.QuadPart)/(double)(freq.QuadPart); -#elif ON_APPLE - stop = mach_absolute_time(); - time = ((stop - start) * (double)info.numer / info.denom) / 1.0E9; -#else - clock_gettime( CLOCK_MONOTONIC, &time_funct_end ); - time = (time_funct_end.tv_sec - time_funct_start.tv_sec)*1.0 + (time_funct_end.tv_nsec - time_funct_start.tv_nsec)/1000000000.0; -#endif - - } else { -#if ON_WINDOWS - QueryPerformanceCounter(&time_funct_start); -#elif ON_APPLE - start = mach_absolute_time(); -#else - clock_gettime( CLOCK_MONOTONIC, &time_funct_start ); -#endif - Pix *pix = pixCreate(input.width, input.height, 32); - l_uint32 *pixData = pixGetData(pix); - int i, j; - int idx = 0; - for (i = 0; i < input.height ; i++) { - for (j = 0; j < input.width; j++) { - l_uint32 tiffword = tiffdata[i * input.width + j]; - l_int32 rval = ((tiffword) & 0xff); - l_int32 gval = (((tiffword) >> 8) & 0xff); - l_int32 bval = (((tiffword) >> 16) & 0xff); - l_uint32 value = (rval << 24) | (gval << 16) | (bval << 8); - pixData[idx] = value; - idx++; - } - } -#if ON_WINDOWS - QueryPerformanceCounter(&time_funct_end); - time = (time_funct_end.QuadPart-time_funct_start.QuadPart)/(double)(freq.QuadPart); -#elif ON_APPLE - stop = mach_absolute_time(); - time = ((stop - start) * (double)info.numer / info.denom) / 1.0E9; -#else - clock_gettime( CLOCK_MONOTONIC, &time_funct_end ); - time = (time_funct_end.tv_sec - time_funct_start.tv_sec)*1.0 + (time_funct_end.tv_nsec - time_funct_start.tv_nsec)/1000000000.0; -#endif - pixDestroy(&pix); - } - - - // cleanup - - return time; -} - -static double histogramRectMicroBench(GPUEnv *env, - TessScoreEvaluationInputData input, - ds_device_type type) { - double time; -#if ON_WINDOWS - LARGE_INTEGER freq, time_funct_start, time_funct_end; - QueryPerformanceFrequency(&freq); -#elif ON_APPLE - mach_timebase_info_data_t info = {0, 0}; - mach_timebase_info(&info); - long long start, stop; -#else - timespec time_funct_start, time_funct_end; -#endif - - int left = 0; - int top = 0; - int kHistogramSize = 256; - int bytes_per_line = input.width*input.numChannels; - int *histogramAllChannels = new int[kHistogramSize*input.numChannels]; - // function call - if (type == DS_DEVICE_OPENCL_DEVICE) { -#if ON_WINDOWS - QueryPerformanceCounter(&time_funct_start); -#elif ON_APPLE - start = mach_absolute_time(); -#else - clock_gettime( CLOCK_MONOTONIC, &time_funct_start ); -#endif - - OpenclDevice::gpuEnv = *env; - int retVal = OpenclDevice::HistogramRectOCL( - input.imageData, input.numChannels, bytes_per_line, top, left, - input.width, input.height, kHistogramSize, histogramAllChannels); - -#if ON_WINDOWS - QueryPerformanceCounter(&time_funct_end); - time = (time_funct_end.QuadPart-time_funct_start.QuadPart)/(double)(freq.QuadPart); -#elif ON_APPLE - stop = mach_absolute_time(); - if (retVal == 0) { - time = ((stop - start) * (double)info.numer / info.denom) / 1.0E9; - } else { - time = FLT_MAX; - } -#else - clock_gettime( CLOCK_MONOTONIC, &time_funct_end ); - time = (time_funct_end.tv_sec - time_funct_start.tv_sec)*1.0 + (time_funct_end.tv_nsec - time_funct_start.tv_nsec)/1000000000.0; -#endif - } else { - int *histogram = new int[kHistogramSize]; -#if ON_WINDOWS - QueryPerformanceCounter(&time_funct_start); -#elif ON_APPLE - start = mach_absolute_time(); -#else - clock_gettime( CLOCK_MONOTONIC, &time_funct_start ); -#endif - for (int ch = 0; ch < input.numChannels; ++ch) { - tesseract::HistogramRect(input.pix, input.numChannels, left, top, - input.width, input.height, histogram); - } -#if ON_WINDOWS - QueryPerformanceCounter(&time_funct_end); - time = (time_funct_end.QuadPart-time_funct_start.QuadPart)/(double)(freq.QuadPart); -#elif ON_APPLE - stop = mach_absolute_time(); - time = ((stop - start) * (double)info.numer / info.denom) / 1.0E9; -#else - clock_gettime( CLOCK_MONOTONIC, &time_funct_end ); - time = (time_funct_end.tv_sec - time_funct_start.tv_sec)*1.0 + (time_funct_end.tv_nsec - time_funct_start.tv_nsec)/1000000000.0; -#endif - delete[] histogram; - } - - // cleanup - delete[] histogramAllChannels; - return time; -} - -//Reproducing the ThresholdRectToPix native version -static void ThresholdRectToPix_Native(const unsigned char *imagedata, - int bytes_per_pixel, int bytes_per_line, - const int *thresholds, - const int *hi_values, Pix **pix) { - int top = 0; - int left = 0; - int width = pixGetWidth(*pix); - int height = pixGetHeight(*pix); - - *pix = pixCreate(width, height, 1); - uint32_t *pixdata = pixGetData(*pix); - int wpl = pixGetWpl(*pix); - const unsigned char* srcdata = imagedata + top * bytes_per_line + - left * bytes_per_pixel; - for (int y = 0; y < height; ++y) { - const uint8_t *linedata = srcdata; - uint32_t *pixline = pixdata + y * wpl; - for (int x = 0; x < width; ++x, linedata += bytes_per_pixel) { - bool white_result = true; - for (int ch = 0; ch < bytes_per_pixel; ++ch) { - if (hi_values[ch] >= 0 && - (linedata[ch] > thresholds[ch]) == (hi_values[ch] == 0)) { - white_result = false; - break; - } - } - if (white_result) - CLEAR_DATA_BIT(pixline, x); - else - SET_DATA_BIT(pixline, x); - } - srcdata += bytes_per_line; - } -} - -static double thresholdRectToPixMicroBench(GPUEnv *env, - TessScoreEvaluationInputData input, - ds_device_type type) { - double time; -#if ON_WINDOWS - LARGE_INTEGER freq, time_funct_start, time_funct_end; - QueryPerformanceFrequency(&freq); -#elif ON_APPLE - mach_timebase_info_data_t info = {0, 0}; - mach_timebase_info(&info); - long long start, stop; -#else - timespec time_funct_start, time_funct_end; -#endif - - // input data - unsigned char pixelHi = (unsigned char)255; - int* thresholds = new int[4]; - thresholds[0] = pixelHi/2; - thresholds[1] = pixelHi/2; - thresholds[2] = pixelHi/2; - thresholds[3] = pixelHi/2; - int *hi_values = new int[4]; - thresholds[0] = pixelHi; - thresholds[1] = pixelHi; - thresholds[2] = pixelHi; - thresholds[3] = pixelHi; - //Pix* pix = pixCreate(width, height, 1); - int top = 0; - int left = 0; - int bytes_per_line = input.width*input.numChannels; - - // function call - if (type == DS_DEVICE_OPENCL_DEVICE) { -#if ON_WINDOWS - QueryPerformanceCounter(&time_funct_start); -#elif ON_APPLE - start = mach_absolute_time(); -#else - clock_gettime( CLOCK_MONOTONIC, &time_funct_start ); -#endif - - OpenclDevice::gpuEnv = *env; - int retVal = OpenclDevice::ThresholdRectToPixOCL( - input.imageData, input.numChannels, bytes_per_line, thresholds, - hi_values, &input.pix, input.height, input.width, top, left); - -#if ON_WINDOWS - QueryPerformanceCounter(&time_funct_end); - time = (time_funct_end.QuadPart-time_funct_start.QuadPart)/(double)(freq.QuadPart); -#elif ON_APPLE - stop = mach_absolute_time(); - if (retVal == 0) { - time = ((stop - start) * (double)info.numer / info.denom) / 1.0E9; - ; - } else { - time = FLT_MAX; - } - -#else - clock_gettime( CLOCK_MONOTONIC, &time_funct_end ); - time = (time_funct_end.tv_sec - time_funct_start.tv_sec)*1.0 + (time_funct_end.tv_nsec - time_funct_start.tv_nsec)/1000000000.0; -#endif - } else { - - - tesseract::ImageThresholder thresholder; - thresholder.SetImage( input.pix ); -#if ON_WINDOWS - QueryPerformanceCounter(&time_funct_start); -#elif ON_APPLE - start = mach_absolute_time(); -#else - clock_gettime( CLOCK_MONOTONIC, &time_funct_start ); -#endif - ThresholdRectToPix_Native( input.imageData, input.numChannels, bytes_per_line, - thresholds, hi_values, &input.pix ); - -#if ON_WINDOWS - QueryPerformanceCounter(&time_funct_end); - time = (time_funct_end.QuadPart-time_funct_start.QuadPart)/(double)(freq.QuadPart); -#elif ON_APPLE - stop = mach_absolute_time(); - time = ((stop - start) * (double)info.numer / info.denom) / 1.0E9; -#else - clock_gettime( CLOCK_MONOTONIC, &time_funct_end ); - time = (time_funct_end.tv_sec - time_funct_start.tv_sec)*1.0 + (time_funct_end.tv_nsec - time_funct_start.tv_nsec)/1000000000.0; -#endif - } - - // cleanup - delete[] thresholds; - delete[] hi_values; - return time; -} - -static double getLineMasksMorphMicroBench(GPUEnv *env, - TessScoreEvaluationInputData input, - ds_device_type type) { - double time = 0; -#if ON_WINDOWS - LARGE_INTEGER freq, time_funct_start, time_funct_end; - QueryPerformanceFrequency(&freq); -#elif ON_APPLE - mach_timebase_info_data_t info = {0, 0}; - mach_timebase_info(&info); - long long start, stop; -#else - timespec time_funct_start, time_funct_end; -#endif - - // input data - int resolution = 300; - int wpl = pixGetWpl(input.pix); - int kThinLineFraction = 20; // tess constant - int kMinLineLengthFraction = 4; // tess constant - int max_line_width = resolution / kThinLineFraction; - int min_line_length = resolution / kMinLineLengthFraction; - int closing_brick = max_line_width / 3; - - // function call - if (type == DS_DEVICE_OPENCL_DEVICE) { -#if ON_WINDOWS - QueryPerformanceCounter(&time_funct_start); -#elif ON_APPLE - start = mach_absolute_time(); -#else - clock_gettime( CLOCK_MONOTONIC, &time_funct_start ); -#endif - OpenclDevice::gpuEnv = *env; - OpenclDevice::initMorphCLAllocations(wpl, input.height, input.pix); - Pix *pix_vline = nullptr, *pix_hline = nullptr, *pix_closed = nullptr; - OpenclDevice::pixGetLinesCL( - nullptr, input.pix, &pix_vline, &pix_hline, &pix_closed, true, - closing_brick, closing_brick, max_line_width, max_line_width, - min_line_length, min_line_length); - - OpenclDevice::releaseMorphCLBuffers(); - -#if ON_WINDOWS - QueryPerformanceCounter(&time_funct_end); - time = (time_funct_end.QuadPart-time_funct_start.QuadPart)/(double)(freq.QuadPart); -#elif ON_APPLE - stop = mach_absolute_time(); - time = ((stop - start) * (double)info.numer / info.denom) / 1.0E9; -#else - clock_gettime( CLOCK_MONOTONIC, &time_funct_end ); - time = (time_funct_end.tv_sec - time_funct_start.tv_sec)*1.0 + (time_funct_end.tv_nsec - time_funct_start.tv_nsec)/1000000000.0; -#endif - } else { -#if ON_WINDOWS - QueryPerformanceCounter(&time_funct_start); -#elif ON_APPLE - start = mach_absolute_time(); -#else - clock_gettime( CLOCK_MONOTONIC, &time_funct_start ); -#endif - - // native serial code - Pix *src_pix = input.pix; - Pix *pix_closed = - pixCloseBrick(nullptr, src_pix, closing_brick, closing_brick); - Pix *pix_solid = - pixOpenBrick(nullptr, pix_closed, max_line_width, max_line_width); - Pix *pix_hollow = pixSubtract(nullptr, pix_closed, pix_solid); - pixDestroy(&pix_solid); - Pix *pix_vline = pixOpenBrick(nullptr, pix_hollow, 1, min_line_length); - Pix *pix_hline = pixOpenBrick(nullptr, pix_hollow, min_line_length, 1); - pixDestroy(&pix_hollow); - -#if ON_WINDOWS - QueryPerformanceCounter(&time_funct_end); - time = (time_funct_end.QuadPart-time_funct_start.QuadPart)/(double)(freq.QuadPart); -#elif ON_APPLE - stop = mach_absolute_time(); - time = ((stop - start) * (double)info.numer / info.denom) / 1.0E9; -#else - clock_gettime( CLOCK_MONOTONIC, &time_funct_end ); - time = (time_funct_end.tv_sec - time_funct_start.tv_sec)*1.0 + (time_funct_end.tv_nsec - time_funct_start.tv_nsec)/1000000000.0; -#endif - } - - return time; -} - - - -/****************************************************************************** - * Device Selection - *****************************************************************************/ - -#include "stdlib.h" - -// encode score object as byte string -static ds_status serializeScore(ds_device *device, void **serializedScore, - unsigned int *serializedScoreSize) { - *serializedScoreSize = sizeof(TessDeviceScore); - *serializedScore = new unsigned char[*serializedScoreSize]; - memcpy(*serializedScore, device->score, *serializedScoreSize); - return DS_SUCCESS; -} - -// parses byte string and stores in score object -static ds_status deserializeScore(ds_device *device, - const unsigned char *serializedScore, - unsigned int serializedScoreSize) { - // check that serializedScoreSize == sizeof(TessDeviceScore); - device->score = new TessDeviceScore; - memcpy(device->score, serializedScore, serializedScoreSize); - return DS_SUCCESS; -} - -static ds_status releaseScore(void *score) { - delete (TessDeviceScore *)score; - return DS_SUCCESS; -} - -// evaluate devices -static ds_status evaluateScoreForDevice(ds_device *device, void *inputData) { - // overwrite statuc gpuEnv w/ current device - // so native opencl calls can be used; they use static gpuEnv - printf("\n[DS] Device: \"%s\" (%s) evaluation...\n", device->oclDeviceName, - device->type == DS_DEVICE_OPENCL_DEVICE ? "OpenCL" : "Native"); - GPUEnv *env = nullptr; - if (device->type == DS_DEVICE_OPENCL_DEVICE) { - env = new GPUEnv; - // printf("[DS] populating tmp GPUEnv from device\n"); - populateGPUEnvFromDevice(env, device->oclDeviceID); - env->mnFileCount = 0; // argc; - env->mnKernelCount = 0UL; - // printf("[DS] compiling kernels for tmp GPUEnv\n"); - OpenclDevice::gpuEnv = *env; - OpenclDevice::CompileKernelFile(env, ""); - } - - TessScoreEvaluationInputData *input = - static_cast(inputData); - - // pixReadTiff - double composeRGBPixelTime = - composeRGBPixelMicroBench(env, *input, device->type); - - // HistogramRect - double histogramRectTime = histogramRectMicroBench(env, *input, device->type); - - // ThresholdRectToPix - double thresholdRectToPixTime = - thresholdRectToPixMicroBench(env, *input, device->type); - - // getLineMasks - double getLineMasksMorphTime = - getLineMasksMorphMicroBench(env, *input, device->type); - - // weigh times (% of cpu time) - // these weights should be the % execution time that the native cpu code took - float composeRGBPixelWeight = 1.2f; - float histogramRectWeight = 2.4f; - float thresholdRectToPixWeight = 4.5f; - float getLineMasksMorphWeight = 5.0f; - - float weightedTime = composeRGBPixelWeight * composeRGBPixelTime + - histogramRectWeight * histogramRectTime + - thresholdRectToPixWeight * thresholdRectToPixTime + - getLineMasksMorphWeight * getLineMasksMorphTime; - device->score = new TessDeviceScore; - ((TessDeviceScore *)device->score)->time = weightedTime; - - printf("[DS] Device: \"%s\" (%s) evaluated\n", device->oclDeviceName, - device->type == DS_DEVICE_OPENCL_DEVICE ? "OpenCL" : "Native"); - printf("[DS]%25s: %f (w=%.1f)\n", "composeRGBPixel", composeRGBPixelTime, - composeRGBPixelWeight); - printf("[DS]%25s: %f (w=%.1f)\n", "HistogramRect", histogramRectTime, - histogramRectWeight); - printf("[DS]%25s: %f (w=%.1f)\n", "ThresholdRectToPix", - thresholdRectToPixTime, thresholdRectToPixWeight); - printf("[DS]%25s: %f (w=%.1f)\n", "getLineMasksMorph", getLineMasksMorphTime, - getLineMasksMorphWeight); - printf("[DS]%25s: %f\n", "Score", - static_cast(device->score)->time); - return DS_SUCCESS; -} - -// initial call to select device -ds_device OpenclDevice::getDeviceSelection( ) { - if (!deviceIsSelected) { - PERF_COUNT_START("getDeviceSelection") - // check if opencl is available at runtime - if (1 == LoadOpencl()) { - // opencl is available - // PERF_COUNT_SUB("LoadOpencl") - // setup devices - ds_status status; - ds_profile *profile; - status = initDSProfile(&profile, "v0.1"); - PERF_COUNT_SUB("initDSProfile") - // try reading scores from file - const char *fileName = "tesseract_opencl_profile_devices.dat"; - status = readProfileFromFile(profile, deserializeScore, fileName); - if (status != DS_SUCCESS) { - // need to run evaluation - printf("[DS] Profile file not available (%s); performing profiling.\n", - fileName); - - // create input data - TessScoreEvaluationInputData input; - populateTessScoreEvaluationInputData(&input); - // PERF_COUNT_SUB("populateTessScoreEvaluationInputData") - // perform evaluations - unsigned int numUpdates; - status = profileDevices(profile, DS_EVALUATE_ALL, - evaluateScoreForDevice, &input, &numUpdates); - PERF_COUNT_SUB("profileDevices") - // write scores to file - if (status == DS_SUCCESS) { - status = writeProfileToFile(profile, serializeScore, fileName); - PERF_COUNT_SUB("writeProfileToFile") - if (status == DS_SUCCESS) { - printf("[DS] Scores written to file (%s).\n", fileName); - } else { - printf( - "[DS] Error saving scores to file (%s); scores not written to " - "file.\n", - fileName); - } - } else { - printf( - "[DS] Unable to evaluate performance; scores not written to " - "file.\n"); - } - } else { - PERF_COUNT_SUB("readProfileFromFile") - printf("[DS] Profile read from file (%s).\n", fileName); - } - - // we now have device scores either from file or evaluation - // select fastest using custom Tesseract selection algorithm - float bestTime = FLT_MAX; // begin search with worst possible time - int bestDeviceIdx = -1; - for (unsigned d = 0; d < profile->numDevices; d++) { - ds_device device = profile->devices[d]; - TessDeviceScore score = *(TessDeviceScore *)device.score; - - float time = score.time; - printf("[DS] Device[%u] %i:%s score is %f\n", d + 1, device.type, - device.oclDeviceName, time); - if (time < bestTime) { - bestTime = time; - bestDeviceIdx = d; - } - } - printf("[DS] Selected Device[%i]: \"%s\" (%s)\n", bestDeviceIdx + 1, - profile->devices[bestDeviceIdx].oclDeviceName, - profile->devices[bestDeviceIdx].type == DS_DEVICE_OPENCL_DEVICE - ? "OpenCL" - : "Native"); - // cleanup - // TODO: call destructor for profile object? - - bool overridden = false; - char *overrideDeviceStr = getenv("TESSERACT_OPENCL_DEVICE"); - if (overrideDeviceStr != nullptr) { - int overrideDeviceIdx = atoi(overrideDeviceStr); - if (overrideDeviceIdx > 0 && overrideDeviceIdx <= profile->numDevices) { - printf( - "[DS] Overriding Device Selection (TESSERACT_OPENCL_DEVICE=%s, " - "%i)\n", - overrideDeviceStr, overrideDeviceIdx); - bestDeviceIdx = overrideDeviceIdx - 1; - overridden = true; - } else { - printf( - "[DS] Ignoring invalid TESSERACT_OPENCL_DEVICE=%s ([1,%i] are " - "valid devices).\n", - overrideDeviceStr, profile->numDevices); - } - } - - if (overridden) { - printf("[DS] Overridden Device[%i]: \"%s\" (%s)\n", bestDeviceIdx + 1, - profile->devices[bestDeviceIdx].oclDeviceName, - profile->devices[bestDeviceIdx].type == DS_DEVICE_OPENCL_DEVICE - ? "OpenCL" - : "Native"); - } - selectedDevice = profile->devices[bestDeviceIdx]; - // cleanup - releaseDSProfile(profile, releaseScore); - } else { - // opencl isn't available at runtime, select native cpu device - printf("[DS] OpenCL runtime not available.\n"); - selectedDevice.type = DS_DEVICE_NATIVE_CPU; - selectedDevice.oclDeviceName = "(null)"; - selectedDevice.score = nullptr; - selectedDevice.oclDeviceID = nullptr; - selectedDevice.oclDriverVersion = nullptr; - } - deviceIsSelected = true; - PERF_COUNT_SUB("select from Profile") - PERF_COUNT_END - } - // PERF_COUNT_END - return selectedDevice; -} - - -bool OpenclDevice::selectedDeviceIsOpenCL() { - ds_device device = getDeviceSelection(); - return (device.type == DS_DEVICE_OPENCL_DEVICE); -} - -#endif +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#ifdef _WIN32 +#include +#else +#include +#include +#endif +#include + +#include "openclwrapper.h" +#include "oclkernels.h" + +// for micro-benchmark +#include "otsuthr.h" +#include "thresholder.h" + +#if ON_APPLE +#include +#include +#endif + +#define CALLOC LEPT_CALLOC +#define FREE LEPT_FREE + +#ifdef USE_OPENCL + +#include "opencl_device_selection.h" +GPUEnv OpenclDevice::gpuEnv; + +bool OpenclDevice::deviceIsSelected = false; +ds_device OpenclDevice::selectedDevice; + +int OpenclDevice::isInited = 0; + +static l_int32 MORPH_BC = ASYMMETRIC_MORPH_BC; + +static const l_uint32 lmask32[] = { + 0x80000000, 0xc0000000, 0xe0000000, 0xf0000000, 0xf8000000, 0xfc000000, + 0xfe000000, 0xff000000, 0xff800000, 0xffc00000, 0xffe00000, 0xfff00000, + 0xfff80000, 0xfffc0000, 0xfffe0000, 0xffff0000, 0xffff8000, 0xffffc000, + 0xffffe000, 0xfffff000, 0xfffff800, 0xfffffc00, 0xfffffe00, 0xffffff00, + 0xffffff80, 0xffffffc0, 0xffffffe0, 0xfffffff0, 0xfffffff8, 0xfffffffc, + 0xfffffffe, 0xffffffff}; + +static const l_uint32 rmask32[] = { + 0x00000001, 0x00000003, 0x00000007, 0x0000000f, 0x0000001f, 0x0000003f, + 0x0000007f, 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff, + 0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff, 0x0001ffff, 0x0003ffff, + 0x0007ffff, 0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff, 0x00ffffff, + 0x01ffffff, 0x03ffffff, 0x07ffffff, 0x0fffffff, 0x1fffffff, 0x3fffffff, + 0x7fffffff, 0xffffffff}; + +static cl_mem pixsCLBuffer, pixdCLBuffer, + pixdCLIntermediate; // Morph operations buffers +static cl_mem pixThBuffer; // output from thresholdtopix calculation +static cl_int clStatus; +static KernelEnv rEnv; + +#define DS_TAG_VERSION "" +#define DS_TAG_VERSION_END "" +#define DS_TAG_DEVICE "" +#define DS_TAG_DEVICE_END "" +#define DS_TAG_SCORE "" +#define DS_TAG_SCORE_END "" +#define DS_TAG_DEVICE_TYPE "" +#define DS_TAG_DEVICE_TYPE_END "" +#define DS_TAG_DEVICE_NAME "" +#define DS_TAG_DEVICE_NAME_END "" +#define DS_TAG_DEVICE_DRIVER_VERSION "" +#define DS_TAG_DEVICE_DRIVER_VERSION_END "" + +#define DS_DEVICE_NATIVE_CPU_STRING "native_cpu" + +#define DS_DEVICE_NAME_LENGTH 256 + +typedef enum { DS_EVALUATE_ALL, DS_EVALUATE_NEW_ONLY } ds_evaluation_type; + +typedef struct { + unsigned int numDevices; + ds_device *devices; + const char *version; +} ds_profile; + +typedef enum { + DS_SUCCESS = 0, + DS_INVALID_PROFILE = 1000, + DS_MEMORY_ERROR, + DS_INVALID_PERF_EVALUATOR_TYPE, + DS_INVALID_PERF_EVALUATOR, + DS_PERF_EVALUATOR_ERROR, + DS_FILE_ERROR, + DS_UNKNOWN_DEVICE_TYPE, + DS_PROFILE_FILE_ERROR, + DS_SCORE_SERIALIZER_ERROR, + DS_SCORE_DESERIALIZER_ERROR +} ds_status; + +// Pointer to a function that calculates the score of a device (ex: +// device->score) update the data size of score. The encoding and the format +// of the score data is implementation defined. The function should return +// DS_SUCCESS if there's no error to be reported. +typedef ds_status (*ds_perf_evaluator)(ds_device *device, void *data); + +// deallocate memory used by score +typedef ds_status (*ds_score_release)(void *score); +static ds_status releaseDSProfile(ds_profile *profile, ds_score_release sr) { + ds_status status = DS_SUCCESS; + if (profile != nullptr) { + if (profile->devices != nullptr && sr != nullptr) { + unsigned int i; + for (i = 0; i < profile->numDevices; i++) { + free(profile->devices[i].oclDeviceName); + free(profile->devices[i].oclDriverVersion); + status = sr(profile->devices[i].score); + if (status != DS_SUCCESS) break; + } + free(profile->devices); + } + free(profile); + } + return status; +} + +static ds_status initDSProfile(ds_profile **p, const char *version) { + int numDevices; + cl_uint numPlatforms; + cl_platform_id *platforms = nullptr; + cl_device_id *devices = nullptr; + ds_status status = DS_SUCCESS; + unsigned int next; + unsigned int i; + + if (p == nullptr) return DS_INVALID_PROFILE; + + ds_profile *profile = (ds_profile *)malloc(sizeof(ds_profile)); + if (profile == nullptr) return DS_MEMORY_ERROR; + + memset(profile, 0, sizeof(ds_profile)); + + clGetPlatformIDs(0, nullptr, &numPlatforms); + + if (numPlatforms > 0) { + platforms = (cl_platform_id *)malloc(numPlatforms * sizeof(cl_platform_id)); + if (platforms == nullptr) { + status = DS_MEMORY_ERROR; + goto cleanup; + } + clGetPlatformIDs(numPlatforms, platforms, nullptr); + } + + numDevices = 0; + for (i = 0; i < (unsigned int)numPlatforms; i++) { + cl_uint num; + clGetDeviceIDs(platforms[i], CL_DEVICE_TYPE_ALL, 0, nullptr, &num); + numDevices += num; + } + + if (numDevices > 0) { + devices = (cl_device_id *)malloc(numDevices * sizeof(cl_device_id)); + if (devices == nullptr) { + status = DS_MEMORY_ERROR; + goto cleanup; + } + } + + profile->numDevices = + numDevices + 1; // +1 to numDevices to include the native CPU + profile->devices = + (ds_device *)malloc(profile->numDevices * sizeof(ds_device)); + if (profile->devices == nullptr) { + profile->numDevices = 0; + status = DS_MEMORY_ERROR; + goto cleanup; + } + memset(profile->devices, 0, profile->numDevices * sizeof(ds_device)); + + next = 0; + for (i = 0; i < (unsigned int)numPlatforms; i++) { + cl_uint num; + unsigned j; + clGetDeviceIDs(platforms[i], CL_DEVICE_TYPE_ALL, numDevices, devices, &num); + for (j = 0; j < num; j++, next++) { + char buffer[DS_DEVICE_NAME_LENGTH]; + size_t length; + + profile->devices[next].type = DS_DEVICE_OPENCL_DEVICE; + profile->devices[next].oclDeviceID = devices[j]; + + clGetDeviceInfo(profile->devices[next].oclDeviceID, CL_DEVICE_NAME, + DS_DEVICE_NAME_LENGTH, &buffer, nullptr); + length = strlen(buffer); + profile->devices[next].oclDeviceName = (char *)malloc(length + 1); + memcpy(profile->devices[next].oclDeviceName, buffer, length + 1); + + clGetDeviceInfo(profile->devices[next].oclDeviceID, CL_DRIVER_VERSION, + DS_DEVICE_NAME_LENGTH, &buffer, nullptr); + length = strlen(buffer); + profile->devices[next].oclDriverVersion = (char *)malloc(length + 1); + memcpy(profile->devices[next].oclDriverVersion, buffer, length + 1); + } + } + profile->devices[next].type = DS_DEVICE_NATIVE_CPU; + profile->version = version; + +cleanup: + free(platforms); + free(devices); + if (status == DS_SUCCESS) { + *p = profile; + } else { + if (profile) { + free(profile->devices); + free(profile); + } + } + return status; +} + +static ds_status profileDevices(ds_profile *profile, + const ds_evaluation_type type, + ds_perf_evaluator evaluator, + void *evaluatorData, unsigned int *numUpdates) { + ds_status status = DS_SUCCESS; + unsigned int i; + unsigned int updates = 0; + + if (profile == nullptr) { + return DS_INVALID_PROFILE; + } + if (evaluator == nullptr) { + return DS_INVALID_PERF_EVALUATOR; + } + + for (i = 0; i < profile->numDevices; i++) { + ds_status evaluatorStatus; + + switch (type) { + case DS_EVALUATE_NEW_ONLY: + if (profile->devices[i].score != nullptr) break; + // else fall through + case DS_EVALUATE_ALL: + evaluatorStatus = evaluator(profile->devices + i, evaluatorData); + if (evaluatorStatus != DS_SUCCESS) { + status = evaluatorStatus; + return status; + } + updates++; + break; + default: + return DS_INVALID_PERF_EVALUATOR_TYPE; + break; + }; + } + if (numUpdates) *numUpdates = updates; + return status; +} + +static const char *findString(const char *contentStart, const char *contentEnd, + const char *string) { + size_t stringLength; + const char *currentPosition; + const char *found = nullptr; + stringLength = strlen(string); + currentPosition = contentStart; + for (currentPosition = contentStart; currentPosition < contentEnd; + currentPosition++) { + if (*currentPosition == string[0]) { + if (currentPosition + stringLength < contentEnd) { + if (strncmp(currentPosition, string, stringLength) == 0) { + found = currentPosition; + break; + } + } + } + } + return found; +} + +static ds_status readProFile(const char *fileName, char **content, + size_t *contentSize) { + size_t size = 0; + + *contentSize = 0; + *content = nullptr; + + FILE *input = fopen(fileName, "rb"); + if (input == nullptr) { + return DS_FILE_ERROR; + } + + fseek(input, 0L, SEEK_END); + size = ftell(input); + rewind(input); + char *binary = (char *)malloc(size); + if (binary == nullptr) { + fclose(input); + return DS_FILE_ERROR; + } + fread(binary, sizeof(char), size, input); + fclose(input); + + *contentSize = size; + *content = binary; + return DS_SUCCESS; +} + +typedef ds_status (*ds_score_deserializer)(ds_device *device, + const unsigned char *serializedScore, + unsigned int serializedScoreSize); + +static ds_status readProfileFromFile(ds_profile *profile, + ds_score_deserializer deserializer, + const char *file) { + ds_status status = DS_SUCCESS; + char *contentStart = nullptr; + const char *contentEnd = nullptr; + size_t contentSize; + + if (profile == nullptr) return DS_INVALID_PROFILE; + + status = readProFile(file, &contentStart, &contentSize); + if (status == DS_SUCCESS) { + const char *currentPosition; + const char *dataStart; + const char *dataEnd; + + contentEnd = contentStart + contentSize; + currentPosition = contentStart; + + // parse the version string + dataStart = findString(currentPosition, contentEnd, DS_TAG_VERSION); + if (dataStart == nullptr) { + status = DS_PROFILE_FILE_ERROR; + goto cleanup; + } + dataStart += strlen(DS_TAG_VERSION); + + dataEnd = findString(dataStart, contentEnd, DS_TAG_VERSION_END); + if (dataEnd == nullptr) { + status = DS_PROFILE_FILE_ERROR; + goto cleanup; + } + + size_t versionStringLength = strlen(profile->version); + if (versionStringLength + dataStart != dataEnd || + strncmp(profile->version, dataStart, versionStringLength) != 0) { + // version mismatch + status = DS_PROFILE_FILE_ERROR; + goto cleanup; + } + currentPosition = dataEnd + strlen(DS_TAG_VERSION_END); + + // parse the device information + while (1) { + unsigned int i; + + const char *deviceTypeStart; + const char *deviceTypeEnd; + ds_device_type deviceType; + + const char *deviceNameStart; + const char *deviceNameEnd; + + const char *deviceScoreStart; + const char *deviceScoreEnd; + + const char *deviceDriverStart; + const char *deviceDriverEnd; + + dataStart = findString(currentPosition, contentEnd, DS_TAG_DEVICE); + if (dataStart == nullptr) { + // nothing useful remain, quit... + break; + } + dataStart += strlen(DS_TAG_DEVICE); + dataEnd = findString(dataStart, contentEnd, DS_TAG_DEVICE_END); + if (dataEnd == nullptr) { + status = DS_PROFILE_FILE_ERROR; + goto cleanup; + } + + // parse the device type + deviceTypeStart = findString(dataStart, contentEnd, DS_TAG_DEVICE_TYPE); + if (deviceTypeStart == nullptr) { + status = DS_PROFILE_FILE_ERROR; + goto cleanup; + } + deviceTypeStart += strlen(DS_TAG_DEVICE_TYPE); + deviceTypeEnd = + findString(deviceTypeStart, contentEnd, DS_TAG_DEVICE_TYPE_END); + if (deviceTypeEnd == nullptr) { + status = DS_PROFILE_FILE_ERROR; + goto cleanup; + } + memcpy(&deviceType, deviceTypeStart, sizeof(ds_device_type)); + + // parse the device name + if (deviceType == DS_DEVICE_OPENCL_DEVICE) { + deviceNameStart = findString(dataStart, contentEnd, DS_TAG_DEVICE_NAME); + if (deviceNameStart == nullptr) { + status = DS_PROFILE_FILE_ERROR; + goto cleanup; + } + deviceNameStart += strlen(DS_TAG_DEVICE_NAME); + deviceNameEnd = + findString(deviceNameStart, contentEnd, DS_TAG_DEVICE_NAME_END); + if (deviceNameEnd == nullptr) { + status = DS_PROFILE_FILE_ERROR; + goto cleanup; + } + + deviceDriverStart = + findString(dataStart, contentEnd, DS_TAG_DEVICE_DRIVER_VERSION); + if (deviceDriverStart == nullptr) { + status = DS_PROFILE_FILE_ERROR; + goto cleanup; + } + deviceDriverStart += strlen(DS_TAG_DEVICE_DRIVER_VERSION); + deviceDriverEnd = findString(deviceDriverStart, contentEnd, + DS_TAG_DEVICE_DRIVER_VERSION_END); + if (deviceDriverEnd == nullptr) { + status = DS_PROFILE_FILE_ERROR; + goto cleanup; + } + + // check if this device is on the system + for (i = 0; i < profile->numDevices; i++) { + if (profile->devices[i].type == DS_DEVICE_OPENCL_DEVICE) { + size_t actualDeviceNameLength; + size_t driverVersionLength; + + actualDeviceNameLength = strlen(profile->devices[i].oclDeviceName); + driverVersionLength = strlen(profile->devices[i].oclDriverVersion); + if (deviceNameStart + actualDeviceNameLength == deviceNameEnd && + deviceDriverStart + driverVersionLength == deviceDriverEnd && + strncmp(profile->devices[i].oclDeviceName, deviceNameStart, + actualDeviceNameLength) == 0 && + strncmp(profile->devices[i].oclDriverVersion, deviceDriverStart, + driverVersionLength) == 0) { + deviceScoreStart = + findString(dataStart, contentEnd, DS_TAG_SCORE); + if (deviceNameStart == nullptr) { + status = DS_PROFILE_FILE_ERROR; + goto cleanup; + } + deviceScoreStart += strlen(DS_TAG_SCORE); + deviceScoreEnd = + findString(deviceScoreStart, contentEnd, DS_TAG_SCORE_END); + status = deserializer(profile->devices + i, + (const unsigned char *)deviceScoreStart, + deviceScoreEnd - deviceScoreStart); + if (status != DS_SUCCESS) { + goto cleanup; + } + } + } + } + } else if (deviceType == DS_DEVICE_NATIVE_CPU) { + for (i = 0; i < profile->numDevices; i++) { + if (profile->devices[i].type == DS_DEVICE_NATIVE_CPU) { + deviceScoreStart = findString(dataStart, contentEnd, DS_TAG_SCORE); + if (deviceScoreStart == nullptr) { + status = DS_PROFILE_FILE_ERROR; + goto cleanup; + } + deviceScoreStart += strlen(DS_TAG_SCORE); + deviceScoreEnd = + findString(deviceScoreStart, contentEnd, DS_TAG_SCORE_END); + status = deserializer(profile->devices + i, + (const unsigned char *)deviceScoreStart, + deviceScoreEnd - deviceScoreStart); + if (status != DS_SUCCESS) { + goto cleanup; + } + } + } + } + + // skip over the current one to find the next device + currentPosition = dataEnd + strlen(DS_TAG_DEVICE_END); + } + } +cleanup: + free(contentStart); + return status; +} + +typedef ds_status (*ds_score_serializer)(ds_device *device, + void **serializedScore, + unsigned int *serializedScoreSize); +static ds_status writeProfileToFile(ds_profile *profile, + ds_score_serializer serializer, + const char *file) { + ds_status status = DS_SUCCESS; + + if (profile == nullptr) return DS_INVALID_PROFILE; + + FILE *profileFile = fopen(file, "wb"); + if (profileFile == nullptr) { + status = DS_FILE_ERROR; + } else { + unsigned int i; + + // write version string + fwrite(DS_TAG_VERSION, sizeof(char), strlen(DS_TAG_VERSION), profileFile); + fwrite(profile->version, sizeof(char), strlen(profile->version), + profileFile); + fwrite(DS_TAG_VERSION_END, sizeof(char), strlen(DS_TAG_VERSION_END), + profileFile); + fwrite("\n", sizeof(char), 1, profileFile); + + for (i = 0; i < profile->numDevices && status == DS_SUCCESS; i++) { + void *serializedScore; + unsigned int serializedScoreSize; + + fwrite(DS_TAG_DEVICE, sizeof(char), strlen(DS_TAG_DEVICE), profileFile); + + fwrite(DS_TAG_DEVICE_TYPE, sizeof(char), strlen(DS_TAG_DEVICE_TYPE), + profileFile); + fwrite(&profile->devices[i].type, sizeof(ds_device_type), 1, profileFile); + fwrite(DS_TAG_DEVICE_TYPE_END, sizeof(char), + strlen(DS_TAG_DEVICE_TYPE_END), profileFile); + + switch (profile->devices[i].type) { + case DS_DEVICE_NATIVE_CPU: { + // There's no need to emit a device name for the native CPU device. + /* + fwrite(DS_TAG_DEVICE_NAME, sizeof(char), strlen(DS_TAG_DEVICE_NAME), + profileFile); + fwrite(DS_DEVICE_NATIVE_CPU_STRING,sizeof(char), + strlen(DS_DEVICE_NATIVE_CPU_STRING), profileFile); + fwrite(DS_TAG_DEVICE_NAME_END, sizeof(char), + strlen(DS_TAG_DEVICE_NAME_END), profileFile); + */ + } break; + case DS_DEVICE_OPENCL_DEVICE: { + fwrite(DS_TAG_DEVICE_NAME, sizeof(char), strlen(DS_TAG_DEVICE_NAME), + profileFile); + fwrite(profile->devices[i].oclDeviceName, sizeof(char), + strlen(profile->devices[i].oclDeviceName), profileFile); + fwrite(DS_TAG_DEVICE_NAME_END, sizeof(char), + strlen(DS_TAG_DEVICE_NAME_END), profileFile); + + fwrite(DS_TAG_DEVICE_DRIVER_VERSION, sizeof(char), + strlen(DS_TAG_DEVICE_DRIVER_VERSION), profileFile); + fwrite(profile->devices[i].oclDriverVersion, sizeof(char), + strlen(profile->devices[i].oclDriverVersion), profileFile); + fwrite(DS_TAG_DEVICE_DRIVER_VERSION_END, sizeof(char), + strlen(DS_TAG_DEVICE_DRIVER_VERSION_END), profileFile); + } break; + default: + status = DS_UNKNOWN_DEVICE_TYPE; + break; + }; + + fwrite(DS_TAG_SCORE, sizeof(char), strlen(DS_TAG_SCORE), profileFile); + status = serializer(profile->devices + i, &serializedScore, + &serializedScoreSize); + if (status == DS_SUCCESS && serializedScore != nullptr && + serializedScoreSize > 0) { + fwrite(serializedScore, sizeof(char), serializedScoreSize, profileFile); + free(serializedScore); + } + fwrite(DS_TAG_SCORE_END, sizeof(char), strlen(DS_TAG_SCORE_END), + profileFile); + fwrite(DS_TAG_DEVICE_END, sizeof(char), strlen(DS_TAG_DEVICE_END), + profileFile); + fwrite("\n", sizeof(char), 1, profileFile); + } + fclose(profileFile); + } + return status; +} + +// substitute invalid characters in device name with _ +static void legalizeFileName(char *fileName) { + // printf("fileName: %s\n", fileName); + const char *invalidChars = + "/\?:*\"><| "; // space is valid but can cause headaches + // for each invalid char + for (unsigned i = 0; i < strlen(invalidChars); i++) { + char invalidStr[4]; + invalidStr[0] = invalidChars[i]; + invalidStr[1] = '\0'; + // printf("eliminating %s\n", invalidStr); + // char *pos = strstr(fileName, invalidStr); + // initial ./ is valid for present directory + // if (*pos == '.') pos++; + // if (*pos == '/') pos++; + for (char *pos = strstr(fileName, invalidStr); pos != nullptr; + pos = strstr(pos + 1, invalidStr)) { + // printf("\tfound: %s, ", pos); + pos[0] = '_'; + // printf("fileName: %s\n", fileName); + } + } +} + +static void populateGPUEnvFromDevice(GPUEnv *gpuInfo, cl_device_id device) { + // printf("[DS] populateGPUEnvFromDevice\n"); + size_t size; + gpuInfo->mnIsUserCreated = 1; + // device + gpuInfo->mpDevID = device; + gpuInfo->mpArryDevsID = new cl_device_id[1]; + gpuInfo->mpArryDevsID[0] = gpuInfo->mpDevID; + clStatus = clGetDeviceInfo(gpuInfo->mpDevID, CL_DEVICE_TYPE, + sizeof(cl_device_type), &gpuInfo->mDevType, &size); + CHECK_OPENCL(clStatus, "populateGPUEnv::getDeviceInfo(TYPE)"); + // platform + clStatus = + clGetDeviceInfo(gpuInfo->mpDevID, CL_DEVICE_PLATFORM, + sizeof(cl_platform_id), &gpuInfo->mpPlatformID, &size); + CHECK_OPENCL(clStatus, "populateGPUEnv::getDeviceInfo(PLATFORM)"); + // context + cl_context_properties props[3]; + props[0] = CL_CONTEXT_PLATFORM; + props[1] = (cl_context_properties)gpuInfo->mpPlatformID; + props[2] = 0; + gpuInfo->mpContext = + clCreateContext(props, 1, &gpuInfo->mpDevID, nullptr, nullptr, &clStatus); + CHECK_OPENCL(clStatus, "populateGPUEnv::createContext"); + // queue + cl_command_queue_properties queueProperties = 0; + gpuInfo->mpCmdQueue = clCreateCommandQueue( + gpuInfo->mpContext, gpuInfo->mpDevID, queueProperties, &clStatus); + CHECK_OPENCL(clStatus, "populateGPUEnv::createCommandQueue"); +} + +int OpenclDevice::LoadOpencl() +{ +#ifdef WIN32 + HINSTANCE HOpenclDll = nullptr; + void *OpenclDll = nullptr; + // fprintf(stderr, " LoadOpenclDllxx... \n"); + OpenclDll = static_cast(HOpenclDll); + OpenclDll = LoadLibrary("openCL.dll"); + if (!static_cast(OpenclDll)) { + fprintf(stderr, "[OD] Load opencl.dll failed!\n"); + FreeLibrary(static_cast(OpenclDll)); + return 0; + } + fprintf(stderr, "[OD] Load opencl.dll successful!\n"); +#endif + return 1; +} +int OpenclDevice::SetKernelEnv( KernelEnv *envInfo ) +{ + envInfo->mpkContext = gpuEnv.mpContext; + envInfo->mpkCmdQueue = gpuEnv.mpCmdQueue; + envInfo->mpkProgram = gpuEnv.mpArryPrograms[0]; + + return 1; +} + +static cl_mem allocateZeroCopyBuffer(KernelEnv rEnv, l_uint32 *hostbuffer, + size_t nElements, cl_mem_flags flags, + cl_int *pStatus) { + cl_mem membuffer = + clCreateBuffer(rEnv.mpkContext, (cl_mem_flags)(flags), + nElements * sizeof(l_uint32), hostbuffer, pStatus); + + return membuffer; +} + +static Pix *mapOutputCLBuffer(KernelEnv rEnv, cl_mem clbuffer, Pix *pixd, + Pix *pixs, int elements, cl_mem_flags flags, + bool memcopy = false, bool sync = true) { + PROCNAME("mapOutputCLBuffer"); + if (!pixd) { + if (memcopy) { + if ((pixd = pixCreateTemplate(pixs)) == nullptr) + tprintf("pixd not made\n"); + } else { + if ((pixd = pixCreateHeader(pixGetWidth(pixs), pixGetHeight(pixs), + pixGetDepth(pixs))) == nullptr) + tprintf("pixd not made\n"); + } + } + l_uint32 *pValues = (l_uint32 *)clEnqueueMapBuffer( + rEnv.mpkCmdQueue, clbuffer, CL_TRUE, flags, 0, + elements * sizeof(l_uint32), 0, nullptr, nullptr, nullptr); + + if (memcopy) { + memcpy(pixGetData(pixd), pValues, elements * sizeof(l_uint32)); + } else { + pixSetData(pixd, pValues); + } + + clEnqueueUnmapMemObject(rEnv.mpkCmdQueue, clbuffer, pValues, 0, nullptr, + nullptr); + + if (sync) { + clFinish(rEnv.mpkCmdQueue); + } + + return pixd; +} + +void OpenclDevice::releaseMorphCLBuffers() +{ + if (pixdCLIntermediate != nullptr) clReleaseMemObject(pixdCLIntermediate); + if (pixsCLBuffer != nullptr) clReleaseMemObject(pixsCLBuffer); + if (pixdCLBuffer != nullptr) clReleaseMemObject(pixdCLBuffer); + if (pixThBuffer != nullptr) clReleaseMemObject(pixThBuffer); + pixdCLIntermediate = pixsCLBuffer = pixdCLBuffer = pixThBuffer = nullptr; +} + +int OpenclDevice::initMorphCLAllocations(l_int32 wpl, l_int32 h, Pix *pixs) { + SetKernelEnv(&rEnv); + + if (pixThBuffer != nullptr) { + pixsCLBuffer = allocateZeroCopyBuffer(rEnv, nullptr, wpl * h, + CL_MEM_ALLOC_HOST_PTR, &clStatus); + + // Get the output from ThresholdToPix operation + clStatus = + clEnqueueCopyBuffer(rEnv.mpkCmdQueue, pixThBuffer, pixsCLBuffer, 0, 0, + sizeof(l_uint32) * wpl * h, 0, nullptr, nullptr); + } else { + // Get data from the source image + l_uint32 *srcdata = + reinterpret_cast(malloc(wpl * h * sizeof(l_uint32))); + memcpy(srcdata, pixGetData(pixs), wpl * h * sizeof(l_uint32)); + + pixsCLBuffer = allocateZeroCopyBuffer(rEnv, srcdata, wpl * h, + CL_MEM_USE_HOST_PTR, &clStatus); + } + + pixdCLBuffer = allocateZeroCopyBuffer(rEnv, nullptr, wpl * h, + CL_MEM_ALLOC_HOST_PTR, &clStatus); + + pixdCLIntermediate = allocateZeroCopyBuffer(rEnv, nullptr, wpl * h, + CL_MEM_ALLOC_HOST_PTR, &clStatus); + + return (int)clStatus; +} + +int OpenclDevice::InitEnv() +{ +//PERF_COUNT_START("OD::InitEnv") +// printf("[OD] OpenclDevice::InitEnv()\n"); +#ifdef SAL_WIN32 + while( 1 ) + { + if( 1 == LoadOpencl() ) + break; + } +PERF_COUNT_SUB("LoadOpencl") +#endif + // sets up environment, compiles programs + + InitOpenclRunEnv_DeviceSelection( 0 ); +//PERF_COUNT_SUB("called InitOpenclRunEnv_DS") +//PERF_COUNT_END + return 1; +} + +int OpenclDevice::ReleaseOpenclRunEnv() +{ + ReleaseOpenclEnv( &gpuEnv ); +#ifdef SAL_WIN32 + FreeOpenclDll(); +#endif + return 1; +} +inline int OpenclDevice::AddKernelConfig( int kCount, const char *kName ) +{ + if ( kCount < 1 ) + fprintf(stderr,"Error: ( KCount < 1 ) AddKernelConfig\n" ); + strcpy( gpuEnv.mArrykernelNames[kCount-1], kName ); + gpuEnv.mnKernelCount++; + return 0; +} +int OpenclDevice::RegistOpenclKernel() +{ + if ( !gpuEnv.mnIsUserCreated ) + memset( &gpuEnv, 0, sizeof(gpuEnv) ); + + gpuEnv.mnFileCount = 0; //argc; + gpuEnv.mnKernelCount = 0UL; + + AddKernelConfig( 1, (const char*) "oclAverageSub1" ); + return 0; +} + +int OpenclDevice::InitOpenclRunEnv_DeviceSelection( int argc ) { +//PERF_COUNT_START("InitOpenclRunEnv_DS") + if (!isInited) { + // after programs compiled, selects best device + ds_device bestDevice_DS = getDeviceSelection( ); +//PERF_COUNT_SUB("called getDeviceSelection()") + cl_device_id bestDevice = bestDevice_DS.oclDeviceID; + // overwrite global static GPUEnv with new device + if (selectedDeviceIsOpenCL() ) { + //printf("[DS] InitOpenclRunEnv_DS::Calling populateGPUEnvFromDevice() for selected device\n"); + populateGPUEnvFromDevice( &gpuEnv, bestDevice ); + gpuEnv.mnFileCount = 0; //argc; + gpuEnv.mnKernelCount = 0UL; +//PERF_COUNT_SUB("populate gpuEnv") + CompileKernelFile(&gpuEnv, ""); +//PERF_COUNT_SUB("CompileKernelFile") + } else { + //printf("[DS] InitOpenclRunEnv_DS::Skipping populateGPUEnvFromDevice() b/c native cpu selected\n"); + } + isInited = 1; + } +//PERF_COUNT_END + return 0; +} + + +OpenclDevice::OpenclDevice() +{ + //InitEnv(); +} + +OpenclDevice::~OpenclDevice() +{ + //ReleaseOpenclRunEnv(); +} + +int OpenclDevice::ReleaseOpenclEnv( GPUEnv *gpuInfo ) +{ + int i = 0; + int clStatus = 0; + + if ( !isInited ) + { + return 1; + } + + for ( i = 0; i < gpuEnv.mnFileCount; i++ ) + { + if ( gpuEnv.mpArryPrograms[i] ) + { + clStatus = clReleaseProgram( gpuEnv.mpArryPrograms[i] ); + CHECK_OPENCL( clStatus, "clReleaseProgram" ); + gpuEnv.mpArryPrograms[i] = nullptr; + } + } + if ( gpuEnv.mpCmdQueue ) + { + clReleaseCommandQueue( gpuEnv.mpCmdQueue ); + gpuEnv.mpCmdQueue = nullptr; + } + if ( gpuEnv.mpContext ) + { + clReleaseContext( gpuEnv.mpContext ); + gpuEnv.mpContext = nullptr; + } + isInited = 0; + gpuInfo->mnIsUserCreated = 0; + delete[] gpuInfo->mpArryDevsID; + return 1; +} +int OpenclDevice::BinaryGenerated( const char * clFileName, FILE ** fhandle ) +{ + unsigned int i = 0; + cl_int clStatus; + int status = 0; + char *str = nullptr; + FILE *fd = nullptr; + char fileName[256] = {0}, cl_name[128] = {0}; + char deviceName[1024]; + clStatus = clGetDeviceInfo(gpuEnv.mpArryDevsID[i], CL_DEVICE_NAME, + sizeof(deviceName), deviceName, nullptr); + CHECK_OPENCL(clStatus, "clGetDeviceInfo"); + str = (char *)strstr(clFileName, (char *)".cl"); + memcpy(cl_name, clFileName, str - clFileName); + cl_name[str - clFileName] = '\0'; + sprintf(fileName, "%s-%s.bin", cl_name, deviceName); + legalizeFileName(fileName); + fd = fopen(fileName, "rb"); + status = (fd != nullptr) ? 1 : 0; + if (fd != nullptr) { + *fhandle = fd; + } + return status; + +} +int OpenclDevice::CachedOfKernerPrg( const GPUEnv *gpuEnvCached, const char * clFileName ) +{ + int i; + for ( i = 0; i < gpuEnvCached->mnFileCount; i++ ) + { + if ( strcasecmp( gpuEnvCached->mArryKnelSrcFile[i], clFileName ) == 0 ) + { + if (gpuEnvCached->mpArryPrograms[i] != nullptr) { + return 1; + } + } + } + + return 0; +} +int OpenclDevice::WriteBinaryToFile( const char* fileName, const char* birary, size_t numBytes ) +{ + FILE *output = nullptr; + output = fopen(fileName, "wb"); + if (output == nullptr) { + return 0; + } + + fwrite( birary, sizeof(char), numBytes, output ); + fclose( output ); + + return 1; + +} +int OpenclDevice::GeneratBinFromKernelSource( cl_program program, const char * clFileName ) +{ + unsigned int i = 0; + cl_int clStatus; + size_t *binarySizes; + cl_uint numDevices; + cl_device_id *mpArryDevsID; + char **binaries, *str = nullptr; + + clStatus = clGetProgramInfo(program, CL_PROGRAM_NUM_DEVICES, + sizeof(numDevices), &numDevices, nullptr); + CHECK_OPENCL( clStatus, "clGetProgramInfo" ); + + mpArryDevsID = (cl_device_id*) malloc( sizeof(cl_device_id) * numDevices ); + if (mpArryDevsID == nullptr) { + return 0; + } + /* grab the handles to all of the devices in the program. */ + clStatus = clGetProgramInfo(program, CL_PROGRAM_DEVICES, + sizeof(cl_device_id) * numDevices, mpArryDevsID, + nullptr); + CHECK_OPENCL( clStatus, "clGetProgramInfo" ); + + /* figure out the sizes of each of the binaries. */ + binarySizes = (size_t*) malloc( sizeof(size_t) * numDevices ); + + clStatus = + clGetProgramInfo(program, CL_PROGRAM_BINARY_SIZES, + sizeof(size_t) * numDevices, binarySizes, nullptr); + CHECK_OPENCL( clStatus, "clGetProgramInfo" ); + + /* copy over all of the generated binaries. */ + binaries = (char**) malloc( sizeof(char *) * numDevices ); + if (binaries == nullptr) { + return 0; + } + + for ( i = 0; i < numDevices; i++ ) + { + if ( binarySizes[i] != 0 ) + { + binaries[i] = (char*) malloc( sizeof(char) * binarySizes[i] ); + if (binaries[i] == nullptr) { + return 0; + } + } + else + { + binaries[i] = nullptr; + } + } + + clStatus = clGetProgramInfo(program, CL_PROGRAM_BINARIES, + sizeof(char *) * numDevices, binaries, nullptr); + CHECK_OPENCL(clStatus,"clGetProgramInfo"); + + /* dump out each binary into its own separate file. */ + for ( i = 0; i < numDevices; i++ ) + { + char fileName[256] = { 0 }, cl_name[128] = { 0 }; + + if ( binarySizes[i] != 0 ) + { + char deviceName[1024]; + clStatus = clGetDeviceInfo(mpArryDevsID[i], CL_DEVICE_NAME, + sizeof(deviceName), deviceName, nullptr); + CHECK_OPENCL( clStatus, "clGetDeviceInfo" ); + + str = (char*) strstr( clFileName, (char*) ".cl" ); + memcpy( cl_name, clFileName, str - clFileName ); + cl_name[str - clFileName] = '\0'; + sprintf( fileName, "%s-%s.bin", cl_name, deviceName ); + legalizeFileName(fileName); + if ( !WriteBinaryToFile( fileName, binaries[i], binarySizes[i] ) ) + { + printf("[OD] write binary[%s] failed\n", fileName); + return 0; + } //else + printf("[OD] write binary[%s] successfully\n", fileName); + } + } + + // Release all resouces and memory + for ( i = 0; i < numDevices; i++ ) + { + free(binaries[i]); + binaries[i] = nullptr; + } + + free(binaries); + binaries = nullptr; + + free(binarySizes); + binarySizes = nullptr; + + free(mpArryDevsID); + mpArryDevsID = nullptr; + + return 1; +} + +int OpenclDevice::CompileKernelFile( GPUEnv *gpuInfo, const char *buildOption ) +{ +//PERF_COUNT_START("CompileKernelFile") + cl_int clStatus = 0; + size_t length; + char *buildLog = nullptr, *binary; + const char *source; + size_t source_size[1]; + int b_error, binary_status, binaryExisted, idx; + cl_uint numDevices; + cl_device_id *mpArryDevsID; + FILE *fd, *fd1; + const char* filename = "kernel.cl"; + //fprintf(stderr, "[OD] CompileKernelFile ... \n"); + if ( CachedOfKernerPrg(gpuInfo, filename) == 1 ) + { + return 1; + } + + idx = gpuInfo->mnFileCount; + + source = kernel_src; + + source_size[0] = strlen( source ); + binaryExisted = 0; + binaryExisted = BinaryGenerated( filename, &fd ); // don't check for binary during microbenchmark +//PERF_COUNT_SUB("BinaryGenerated") + if ( binaryExisted == 1 ) + { + clStatus = clGetContextInfo(gpuInfo->mpContext, CL_CONTEXT_NUM_DEVICES, + sizeof(numDevices), &numDevices, nullptr); + CHECK_OPENCL(clStatus, "clGetContextInfo"); + + mpArryDevsID = (cl_device_id *)malloc(sizeof(cl_device_id) * numDevices); + if (mpArryDevsID == nullptr) { + return 0; + } +//PERF_COUNT_SUB("get numDevices") + b_error = 0; + length = 0; + b_error |= fseek( fd, 0, SEEK_END ) < 0; + b_error |= ( length = ftell(fd) ) <= 0; + b_error |= fseek( fd, 0, SEEK_SET ) < 0; + if ( b_error ) + { + return 0; + } + + binary = (char*) malloc( length + 2 ); + if ( !binary ) + { + return 0; + } + + memset( binary, 0, length + 2 ); + b_error |= fread( binary, 1, length, fd ) != length; + + + fclose( fd ); +//PERF_COUNT_SUB("read file") + fd = nullptr; + // grab the handles to all of the devices in the context. + clStatus = clGetContextInfo(gpuInfo->mpContext, CL_CONTEXT_DEVICES, + sizeof(cl_device_id) * numDevices, + mpArryDevsID, nullptr); + CHECK_OPENCL( clStatus, "clGetContextInfo" ); +//PERF_COUNT_SUB("get devices") + //fprintf(stderr, "[OD] Create kernel from binary\n"); + gpuInfo->mpArryPrograms[idx] = clCreateProgramWithBinary( gpuInfo->mpContext,numDevices, + mpArryDevsID, &length, (const unsigned char**) &binary, + &binary_status, &clStatus ); + CHECK_OPENCL( clStatus, "clCreateProgramWithBinary" ); +//PERF_COUNT_SUB("clCreateProgramWithBinary") + free( binary ); + free( mpArryDevsID ); + mpArryDevsID = nullptr; + // PERF_COUNT_SUB("binaryExisted") + } + else + { + // create a CL program using the kernel source + //fprintf(stderr, "[OD] Create kernel from source\n"); + gpuInfo->mpArryPrograms[idx] = clCreateProgramWithSource( gpuInfo->mpContext, 1, &source, + source_size, &clStatus); + CHECK_OPENCL( clStatus, "clCreateProgramWithSource" ); +//PERF_COUNT_SUB("!binaryExisted") + } + + if (gpuInfo->mpArryPrograms[idx] == (cl_program) nullptr) { + return 0; + } + + //char options[512]; + // create a cl program executable for all the devices specified + //printf("[OD] BuildProgram.\n"); +PERF_COUNT_START("OD::CompileKernel::clBuildProgram") + if (!gpuInfo->mnIsUserCreated) + { + clStatus = + clBuildProgram(gpuInfo->mpArryPrograms[idx], 1, gpuInfo->mpArryDevsID, + buildOption, nullptr, nullptr); + // PERF_COUNT_SUB("clBuildProgram notUserCreated") + } + else + { + clStatus = + clBuildProgram(gpuInfo->mpArryPrograms[idx], 1, &(gpuInfo->mpDevID), + buildOption, nullptr, nullptr); + // PERF_COUNT_SUB("clBuildProgram isUserCreated") + } +PERF_COUNT_END + if ( clStatus != CL_SUCCESS ) + { + printf ("BuildProgram error!\n"); + if ( !gpuInfo->mnIsUserCreated ) + { + clStatus = clGetProgramBuildInfo( + gpuInfo->mpArryPrograms[idx], gpuInfo->mpArryDevsID[0], + CL_PROGRAM_BUILD_LOG, 0, nullptr, &length); + } + else + { + clStatus = clGetProgramBuildInfo( + gpuInfo->mpArryPrograms[idx], gpuInfo->mpDevID, + CL_PROGRAM_BUILD_LOG, 0, nullptr, &length); + } + if ( clStatus != CL_SUCCESS ) + { + printf("opencl create build log fail\n"); + return 0; + } + buildLog = (char*) malloc( length ); + if (buildLog == (char *)nullptr) { + return 0; + } + if ( !gpuInfo->mnIsUserCreated ) + { + clStatus = clGetProgramBuildInfo( gpuInfo->mpArryPrograms[idx], gpuInfo->mpArryDevsID[0], + CL_PROGRAM_BUILD_LOG, length, buildLog, &length ); + } + else + { + clStatus = clGetProgramBuildInfo( gpuInfo->mpArryPrograms[idx], gpuInfo->mpDevID, + CL_PROGRAM_BUILD_LOG, length, buildLog, &length ); + } + if ( clStatus != CL_SUCCESS ) + { + printf("opencl program build info fail\n"); + return 0; + } + + fd1 = fopen( "kernel-build.log", "w+" ); + if (fd1 != nullptr) { + fwrite(buildLog, sizeof(char), length, fd1); + fclose(fd1); + } + + free( buildLog ); +//PERF_COUNT_SUB("build error log") + return 0; + } + + strcpy( gpuInfo->mArryKnelSrcFile[idx], filename ); +//PERF_COUNT_SUB("strcpy") + if ( binaryExisted == 0 ) { + GeneratBinFromKernelSource( gpuInfo->mpArryPrograms[idx], filename ); + PERF_COUNT_SUB("GenerateBinFromKernelSource") + } + + gpuInfo->mnFileCount += 1; +//PERF_COUNT_END + return 1; +} + +l_uint32* OpenclDevice::pixReadFromTiffKernel(l_uint32 *tiffdata,l_int32 w,l_int32 h,l_int32 wpl,l_uint32 *line) +{ +PERF_COUNT_START("pixReadFromTiffKernel") + cl_int clStatus; + KernelEnv rEnv; + size_t globalThreads[2]; + size_t localThreads[2]; + int gsize; + cl_mem valuesCl; + cl_mem outputCl; + + //global and local work dimensions for Horizontal pass + gsize = (w + GROUPSIZE_X - 1)/ GROUPSIZE_X * GROUPSIZE_X; + globalThreads[0] = gsize; + gsize = (h + GROUPSIZE_Y - 1)/ GROUPSIZE_Y * GROUPSIZE_Y; + globalThreads[1] = gsize; + localThreads[0] = GROUPSIZE_X; + localThreads[1] = GROUPSIZE_Y; + + SetKernelEnv( &rEnv ); + + l_uint32 *pResult = (l_uint32 *)malloc(w*h * sizeof(l_uint32)); + rEnv.mpkKernel = clCreateKernel( rEnv.mpkProgram, "composeRGBPixel", &clStatus ); + CHECK_OPENCL(clStatus, "clCreateKernel composeRGBPixel"); + + //Allocate input and output OCL buffers + valuesCl = allocateZeroCopyBuffer(rEnv, tiffdata, w*h, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, &clStatus); + outputCl = allocateZeroCopyBuffer(rEnv, pResult, w*h, CL_MEM_WRITE_ONLY | CL_MEM_USE_HOST_PTR, &clStatus); + + //Kernel arguments + clStatus = clSetKernelArg(rEnv.mpkKernel, 0, sizeof(cl_mem), &valuesCl); + CHECK_OPENCL( clStatus, "clSetKernelArg"); + clStatus = clSetKernelArg(rEnv.mpkKernel, 1, sizeof(w), &w); + CHECK_OPENCL( clStatus, "clSetKernelArg" ); + clStatus = clSetKernelArg(rEnv.mpkKernel, 2, sizeof(h), &h); + CHECK_OPENCL( clStatus, "clSetKernelArg" ); + clStatus = clSetKernelArg(rEnv.mpkKernel, 3, sizeof(wpl), &wpl); + CHECK_OPENCL( clStatus, "clSetKernelArg" ); + clStatus = clSetKernelArg(rEnv.mpkKernel, 4, sizeof(cl_mem), &outputCl); + CHECK_OPENCL( clStatus, "clSetKernelArg"); + + //Kernel enqueue +PERF_COUNT_SUB("before") +clStatus = + clEnqueueNDRangeKernel(rEnv.mpkCmdQueue, rEnv.mpkKernel, 2, nullptr, + globalThreads, localThreads, 0, nullptr, nullptr); +CHECK_OPENCL(clStatus, "clEnqueueNDRangeKernel"); + +/* map results back from gpu */ +void *ptr = clEnqueueMapBuffer(rEnv.mpkCmdQueue, outputCl, CL_TRUE, CL_MAP_READ, + 0, w * h * sizeof(l_uint32), 0, nullptr, nullptr, + &clStatus); +CHECK_OPENCL(clStatus, "clEnqueueMapBuffer outputCl"); +clEnqueueUnmapMemObject(rEnv.mpkCmdQueue, outputCl, ptr, 0, nullptr, nullptr); + +// Sync +clFinish(rEnv.mpkCmdQueue); +PERF_COUNT_SUB("kernel & map") +PERF_COUNT_END + return pResult; +} + +//Morphology Dilate operation for 5x5 structuring element. Invokes the relevant OpenCL kernels +static cl_int pixDilateCL_55(l_int32 wpl, l_int32 h) { + size_t globalThreads[2]; + cl_mem pixtemp; + cl_int status; + int gsize; + size_t localThreads[2]; + + // Horizontal pass + gsize = (wpl * h + GROUPSIZE_HMORX - 1) / GROUPSIZE_HMORX * GROUPSIZE_HMORX; + globalThreads[0] = gsize; + globalThreads[1] = GROUPSIZE_HMORY; + localThreads[0] = GROUPSIZE_HMORX; + localThreads[1] = GROUPSIZE_HMORY; + + rEnv.mpkKernel = + clCreateKernel(rEnv.mpkProgram, "morphoDilateHor_5x5", &status); + CHECK_OPENCL(status, "clCreateKernel morphoDilateHor_5x5"); + + status = clSetKernelArg(rEnv.mpkKernel, 0, sizeof(cl_mem), &pixsCLBuffer); + status = clSetKernelArg(rEnv.mpkKernel, 1, sizeof(cl_mem), &pixdCLBuffer); + status = clSetKernelArg(rEnv.mpkKernel, 2, sizeof(wpl), &wpl); + status = clSetKernelArg(rEnv.mpkKernel, 3, sizeof(h), &h); + + status = + clEnqueueNDRangeKernel(rEnv.mpkCmdQueue, rEnv.mpkKernel, 2, nullptr, + globalThreads, localThreads, 0, nullptr, nullptr); + + // Swap source and dest buffers + pixtemp = pixsCLBuffer; + pixsCLBuffer = pixdCLBuffer; + pixdCLBuffer = pixtemp; + + // Vertical + gsize = (wpl + GROUPSIZE_X - 1) / GROUPSIZE_X * GROUPSIZE_X; + globalThreads[0] = gsize; + gsize = (h + GROUPSIZE_Y - 1) / GROUPSIZE_Y * GROUPSIZE_Y; + globalThreads[1] = gsize; + localThreads[0] = GROUPSIZE_X; + localThreads[1] = GROUPSIZE_Y; + + rEnv.mpkKernel = + clCreateKernel(rEnv.mpkProgram, "morphoDilateVer_5x5", &status); + CHECK_OPENCL(status, "clCreateKernel morphoDilateVer_5x5"); + + status = clSetKernelArg(rEnv.mpkKernel, 0, sizeof(cl_mem), &pixsCLBuffer); + status = clSetKernelArg(rEnv.mpkKernel, 1, sizeof(cl_mem), &pixdCLBuffer); + status = clSetKernelArg(rEnv.mpkKernel, 2, sizeof(wpl), &wpl); + status = clSetKernelArg(rEnv.mpkKernel, 3, sizeof(h), &h); + status = + clEnqueueNDRangeKernel(rEnv.mpkCmdQueue, rEnv.mpkKernel, 2, nullptr, + globalThreads, localThreads, 0, nullptr, nullptr); + + return status; +} + +//Morphology Erode operation for 5x5 structuring element. Invokes the relevant OpenCL kernels +static cl_int pixErodeCL_55(l_int32 wpl, l_int32 h) { + size_t globalThreads[2]; + cl_mem pixtemp; + cl_int status; + int gsize; + l_uint32 fwmask, lwmask; + size_t localThreads[2]; + + lwmask = lmask32[31 - 2]; + fwmask = rmask32[31 - 2]; + + // Horizontal pass + gsize = (wpl * h + GROUPSIZE_HMORX - 1) / GROUPSIZE_HMORX * GROUPSIZE_HMORX; + globalThreads[0] = gsize; + globalThreads[1] = GROUPSIZE_HMORY; + localThreads[0] = GROUPSIZE_HMORX; + localThreads[1] = GROUPSIZE_HMORY; + + rEnv.mpkKernel = + clCreateKernel(rEnv.mpkProgram, "morphoErodeHor_5x5", &status); + CHECK_OPENCL(status, "clCreateKernel morphoErodeHor_5x5"); + + status = clSetKernelArg(rEnv.mpkKernel, 0, sizeof(cl_mem), &pixsCLBuffer); + status = clSetKernelArg(rEnv.mpkKernel, 1, sizeof(cl_mem), &pixdCLBuffer); + status = clSetKernelArg(rEnv.mpkKernel, 2, sizeof(wpl), &wpl); + status = clSetKernelArg(rEnv.mpkKernel, 3, sizeof(h), &h); + + status = + clEnqueueNDRangeKernel(rEnv.mpkCmdQueue, rEnv.mpkKernel, 2, nullptr, + globalThreads, localThreads, 0, nullptr, nullptr); + + // Swap source and dest buffers + pixtemp = pixsCLBuffer; + pixsCLBuffer = pixdCLBuffer; + pixdCLBuffer = pixtemp; + + // Vertical + gsize = (wpl + GROUPSIZE_X - 1) / GROUPSIZE_X * GROUPSIZE_X; + globalThreads[0] = gsize; + gsize = (h + GROUPSIZE_Y - 1) / GROUPSIZE_Y * GROUPSIZE_Y; + globalThreads[1] = gsize; + localThreads[0] = GROUPSIZE_X; + localThreads[1] = GROUPSIZE_Y; + + rEnv.mpkKernel = + clCreateKernel(rEnv.mpkProgram, "morphoErodeVer_5x5", &status); + CHECK_OPENCL(status, "clCreateKernel morphoErodeVer_5x5"); + + status = clSetKernelArg(rEnv.mpkKernel, 0, sizeof(cl_mem), &pixsCLBuffer); + status = clSetKernelArg(rEnv.mpkKernel, 1, sizeof(cl_mem), &pixdCLBuffer); + status = clSetKernelArg(rEnv.mpkKernel, 2, sizeof(wpl), &wpl); + status = clSetKernelArg(rEnv.mpkKernel, 3, sizeof(h), &h); + status = clSetKernelArg(rEnv.mpkKernel, 4, sizeof(fwmask), &fwmask); + status = clSetKernelArg(rEnv.mpkKernel, 5, sizeof(lwmask), &lwmask); + status = + clEnqueueNDRangeKernel(rEnv.mpkCmdQueue, rEnv.mpkKernel, 2, nullptr, + globalThreads, localThreads, 0, nullptr, nullptr); + + return status; +} + +//Morphology Dilate operation. Invokes the relevant OpenCL kernels +static cl_int pixDilateCL(l_int32 hsize, l_int32 vsize, l_int32 wpl, + l_int32 h) { + l_int32 xp, yp, xn, yn; + SEL *sel; + size_t globalThreads[2]; + cl_mem pixtemp; + cl_int status; + int gsize; + size_t localThreads[2]; + char isEven; + + OpenclDevice::SetKernelEnv(&rEnv); + + if (hsize == 5 && vsize == 5) { + // Specific case for 5x5 + status = pixDilateCL_55(wpl, h); + return status; + } + + sel = selCreateBrick(vsize, hsize, vsize / 2, hsize / 2, SEL_HIT); + + selFindMaxTranslations(sel, &xp, &yp, &xn, &yn); + selDestroy(&sel); + // global and local work dimensions for Horizontal pass + gsize = (wpl + GROUPSIZE_X - 1) / GROUPSIZE_X * GROUPSIZE_X; + globalThreads[0] = gsize; + gsize = (h + GROUPSIZE_Y - 1) / GROUPSIZE_Y * GROUPSIZE_Y; + globalThreads[1] = gsize; + localThreads[0] = GROUPSIZE_X; + localThreads[1] = GROUPSIZE_Y; + + if (xp > 31 || xn > 31) { + // Generic case. + rEnv.mpkKernel = + clCreateKernel(rEnv.mpkProgram, "morphoDilateHor", &status); + CHECK_OPENCL(status, "clCreateKernel morphoDilateHor"); + + status = clSetKernelArg(rEnv.mpkKernel, 0, sizeof(cl_mem), &pixsCLBuffer); + status = clSetKernelArg(rEnv.mpkKernel, 1, sizeof(cl_mem), &pixdCLBuffer); + status = clSetKernelArg(rEnv.mpkKernel, 2, sizeof(xp), &xp); + status = clSetKernelArg(rEnv.mpkKernel, 3, sizeof(xn), &xn); + status = clSetKernelArg(rEnv.mpkKernel, 4, sizeof(wpl), &wpl); + status = clSetKernelArg(rEnv.mpkKernel, 5, sizeof(h), &h); + status = clEnqueueNDRangeKernel(rEnv.mpkCmdQueue, rEnv.mpkKernel, 2, + nullptr, globalThreads, localThreads, 0, + nullptr, nullptr); + + if (yp > 0 || yn > 0) { + pixtemp = pixsCLBuffer; + pixsCLBuffer = pixdCLBuffer; + pixdCLBuffer = pixtemp; + } + } else if (xp > 0 || xn > 0) { + // Specific Horizontal pass kernel for half width < 32 + rEnv.mpkKernel = + clCreateKernel(rEnv.mpkProgram, "morphoDilateHor_32word", &status); + CHECK_OPENCL(status, "clCreateKernel morphoDilateHor_32word"); + isEven = (xp != xn); + + status = clSetKernelArg(rEnv.mpkKernel, 0, sizeof(cl_mem), &pixsCLBuffer); + status = clSetKernelArg(rEnv.mpkKernel, 1, sizeof(cl_mem), &pixdCLBuffer); + status = clSetKernelArg(rEnv.mpkKernel, 2, sizeof(xp), &xp); + status = clSetKernelArg(rEnv.mpkKernel, 3, sizeof(wpl), &wpl); + status = clSetKernelArg(rEnv.mpkKernel, 4, sizeof(h), &h); + status = clSetKernelArg(rEnv.mpkKernel, 5, sizeof(isEven), &isEven); + status = clEnqueueNDRangeKernel(rEnv.mpkCmdQueue, rEnv.mpkKernel, 2, + nullptr, globalThreads, localThreads, 0, + nullptr, nullptr); + + if (yp > 0 || yn > 0) { + pixtemp = pixsCLBuffer; + pixsCLBuffer = pixdCLBuffer; + pixdCLBuffer = pixtemp; + } + } + + if (yp > 0 || yn > 0) { + rEnv.mpkKernel = + clCreateKernel(rEnv.mpkProgram, "morphoDilateVer", &status); + CHECK_OPENCL(status, "clCreateKernel morphoDilateVer"); + + status = clSetKernelArg(rEnv.mpkKernel, 0, sizeof(cl_mem), &pixsCLBuffer); + status = clSetKernelArg(rEnv.mpkKernel, 1, sizeof(cl_mem), &pixdCLBuffer); + status = clSetKernelArg(rEnv.mpkKernel, 2, sizeof(yp), &yp); + status = clSetKernelArg(rEnv.mpkKernel, 3, sizeof(wpl), &wpl); + status = clSetKernelArg(rEnv.mpkKernel, 4, sizeof(h), &h); + status = clSetKernelArg(rEnv.mpkKernel, 5, sizeof(yn), &yn); + status = clEnqueueNDRangeKernel(rEnv.mpkCmdQueue, rEnv.mpkKernel, 2, + nullptr, globalThreads, localThreads, 0, + nullptr, nullptr); + } + + return status; +} + +//Morphology Erode operation. Invokes the relevant OpenCL kernels +static cl_int pixErodeCL(l_int32 hsize, l_int32 vsize, l_uint32 wpl, + l_uint32 h) { + l_int32 xp, yp, xn, yn; + SEL *sel; + size_t globalThreads[2]; + size_t localThreads[2]; + cl_mem pixtemp; + cl_int status; + int gsize; + char isAsymmetric = (MORPH_BC == ASYMMETRIC_MORPH_BC); + l_uint32 rwmask, lwmask; + char isEven; + + sel = selCreateBrick(vsize, hsize, vsize / 2, hsize / 2, SEL_HIT); + + selFindMaxTranslations(sel, &xp, &yp, &xn, &yn); + selDestroy(&sel); + OpenclDevice::SetKernelEnv(&rEnv); + + if (hsize == 5 && vsize == 5 && isAsymmetric) { + // Specific kernel for 5x5 + status = pixErodeCL_55(wpl, h); + return status; + } + + lwmask = lmask32[31 - (xn & 31)]; + rwmask = rmask32[31 - (xp & 31)]; + + // global and local work dimensions for Horizontal pass + gsize = (wpl + GROUPSIZE_X - 1) / GROUPSIZE_X * GROUPSIZE_X; + globalThreads[0] = gsize; + gsize = (h + GROUPSIZE_Y - 1) / GROUPSIZE_Y * GROUPSIZE_Y; + globalThreads[1] = gsize; + localThreads[0] = GROUPSIZE_X; + localThreads[1] = GROUPSIZE_Y; + + // Horizontal Pass + if (xp > 31 || xn > 31) { + // Generic case. + rEnv.mpkKernel = clCreateKernel(rEnv.mpkProgram, "morphoErodeHor", &status); + + status = clSetKernelArg(rEnv.mpkKernel, 0, sizeof(cl_mem), &pixsCLBuffer); + status = clSetKernelArg(rEnv.mpkKernel, 1, sizeof(cl_mem), &pixdCLBuffer); + status = clSetKernelArg(rEnv.mpkKernel, 2, sizeof(xp), &xp); + status = clSetKernelArg(rEnv.mpkKernel, 3, sizeof(xn), &xn); + status = clSetKernelArg(rEnv.mpkKernel, 4, sizeof(wpl), &wpl); + status = clSetKernelArg(rEnv.mpkKernel, 5, sizeof(h), &h); + status = + clSetKernelArg(rEnv.mpkKernel, 6, sizeof(isAsymmetric), &isAsymmetric); + status = clSetKernelArg(rEnv.mpkKernel, 7, sizeof(rwmask), &rwmask); + status = clSetKernelArg(rEnv.mpkKernel, 8, sizeof(lwmask), &lwmask); + status = clEnqueueNDRangeKernel(rEnv.mpkCmdQueue, rEnv.mpkKernel, 2, + nullptr, globalThreads, localThreads, 0, + nullptr, nullptr); + + if (yp > 0 || yn > 0) { + pixtemp = pixsCLBuffer; + pixsCLBuffer = pixdCLBuffer; + pixdCLBuffer = pixtemp; + } + } else if (xp > 0 || xn > 0) { + rEnv.mpkKernel = + clCreateKernel(rEnv.mpkProgram, "morphoErodeHor_32word", &status); + isEven = (xp != xn); + + status = clSetKernelArg(rEnv.mpkKernel, 0, sizeof(cl_mem), &pixsCLBuffer); + status = clSetKernelArg(rEnv.mpkKernel, 1, sizeof(cl_mem), &pixdCLBuffer); + status = clSetKernelArg(rEnv.mpkKernel, 2, sizeof(xp), &xp); + status = clSetKernelArg(rEnv.mpkKernel, 3, sizeof(wpl), &wpl); + status = clSetKernelArg(rEnv.mpkKernel, 4, sizeof(h), &h); + status = + clSetKernelArg(rEnv.mpkKernel, 5, sizeof(isAsymmetric), &isAsymmetric); + status = clSetKernelArg(rEnv.mpkKernel, 6, sizeof(rwmask), &rwmask); + status = clSetKernelArg(rEnv.mpkKernel, 7, sizeof(lwmask), &lwmask); + status = clSetKernelArg(rEnv.mpkKernel, 8, sizeof(isEven), &isEven); + status = clEnqueueNDRangeKernel(rEnv.mpkCmdQueue, rEnv.mpkKernel, 2, + nullptr, globalThreads, localThreads, 0, + nullptr, nullptr); + + if (yp > 0 || yn > 0) { + pixtemp = pixsCLBuffer; + pixsCLBuffer = pixdCLBuffer; + pixdCLBuffer = pixtemp; + } + } + + // Vertical Pass + if (yp > 0 || yn > 0) { + rEnv.mpkKernel = clCreateKernel(rEnv.mpkProgram, "morphoErodeVer", &status); + CHECK_OPENCL(status, "clCreateKernel morphoErodeVer"); + + status = clSetKernelArg(rEnv.mpkKernel, 0, sizeof(cl_mem), &pixsCLBuffer); + status = clSetKernelArg(rEnv.mpkKernel, 1, sizeof(cl_mem), &pixdCLBuffer); + status = clSetKernelArg(rEnv.mpkKernel, 2, sizeof(yp), &yp); + status = clSetKernelArg(rEnv.mpkKernel, 3, sizeof(wpl), &wpl); + status = clSetKernelArg(rEnv.mpkKernel, 4, sizeof(h), &h); + status = + clSetKernelArg(rEnv.mpkKernel, 5, sizeof(isAsymmetric), &isAsymmetric); + status = clSetKernelArg(rEnv.mpkKernel, 6, sizeof(yn), &yn); + status = clEnqueueNDRangeKernel(rEnv.mpkCmdQueue, rEnv.mpkKernel, 2, + nullptr, globalThreads, localThreads, 0, + nullptr, nullptr); + } + + return status; +} + +//Morphology Open operation. Invokes the relevant OpenCL kernels +static cl_int pixOpenCL(l_int32 hsize, l_int32 vsize, l_int32 wpl, l_int32 h) { + cl_int status; + cl_mem pixtemp; + + // Erode followed by Dilate + status = pixErodeCL(hsize, vsize, wpl, h); + + pixtemp = pixsCLBuffer; + pixsCLBuffer = pixdCLBuffer; + pixdCLBuffer = pixtemp; + + status = pixDilateCL(hsize, vsize, wpl, h); + + return status; +} + +//Morphology Close operation. Invokes the relevant OpenCL kernels +static cl_int pixCloseCL(l_int32 hsize, l_int32 vsize, l_int32 wpl, l_int32 h) { + cl_int status; + cl_mem pixtemp; + + // Dilate followed by Erode + status = pixDilateCL(hsize, vsize, wpl, h); + + pixtemp = pixsCLBuffer; + pixsCLBuffer = pixdCLBuffer; + pixdCLBuffer = pixtemp; + + status = pixErodeCL(hsize, vsize, wpl, h); + + return status; +} + +//output = buffer1 & ~(buffer2) +static cl_int pixSubtractCL_work(l_uint32 wpl, l_uint32 h, cl_mem buffer1, + cl_mem buffer2, cl_mem outBuffer = nullptr) { + cl_int status; + size_t globalThreads[2]; + int gsize; + size_t localThreads[] = {GROUPSIZE_X, GROUPSIZE_Y}; + + gsize = (wpl + GROUPSIZE_X - 1) / GROUPSIZE_X * GROUPSIZE_X; + globalThreads[0] = gsize; + gsize = (h + GROUPSIZE_Y - 1) / GROUPSIZE_Y * GROUPSIZE_Y; + globalThreads[1] = gsize; + + if (outBuffer != nullptr) { + rEnv.mpkKernel = clCreateKernel(rEnv.mpkProgram, "pixSubtract", &status); + CHECK_OPENCL(status, "clCreateKernel pixSubtract"); + } else { + rEnv.mpkKernel = + clCreateKernel(rEnv.mpkProgram, "pixSubtract_inplace", &status); + CHECK_OPENCL(status, "clCreateKernel pixSubtract_inplace"); + } + + // Enqueue a kernel run call. + status = clSetKernelArg(rEnv.mpkKernel, 0, sizeof(cl_mem), &buffer1); + status = clSetKernelArg(rEnv.mpkKernel, 1, sizeof(cl_mem), &buffer2); + status = clSetKernelArg(rEnv.mpkKernel, 2, sizeof(wpl), &wpl); + status = clSetKernelArg(rEnv.mpkKernel, 3, sizeof(h), &h); + if (outBuffer != nullptr) { + status = clSetKernelArg(rEnv.mpkKernel, 4, sizeof(cl_mem), &outBuffer); + } + status = + clEnqueueNDRangeKernel(rEnv.mpkCmdQueue, rEnv.mpkKernel, 2, nullptr, + globalThreads, localThreads, 0, nullptr, nullptr); + + return status; +} + +// OpenCL implementation of Get Lines from pix function +//Note: Assumes the source and dest opencl buffer are initialized. No check done +void OpenclDevice::pixGetLinesCL(Pix *pixd, Pix *pixs, Pix **pix_vline, + Pix **pix_hline, Pix **pixClosed, + bool getpixClosed, l_int32 close_hsize, + l_int32 close_vsize, l_int32 open_hsize, + l_int32 open_vsize, l_int32 line_hsize, + l_int32 line_vsize) { + l_uint32 wpl, h; + cl_mem pixtemp; + + wpl = pixGetWpl(pixs); + h = pixGetHeight(pixs); + + // First step : Close Morph operation: Dilate followed by Erode + clStatus = pixCloseCL(close_hsize, close_vsize, wpl, h); + + // Copy the Close output to CPU buffer + if (getpixClosed) { + *pixClosed = mapOutputCLBuffer(rEnv, pixdCLBuffer, *pixClosed, pixs, + wpl * h, CL_MAP_READ, true, false); + } + + // Store the output of close operation in an intermediate buffer + // this will be later used for pixsubtract + clStatus = + clEnqueueCopyBuffer(rEnv.mpkCmdQueue, pixdCLBuffer, pixdCLIntermediate, 0, + 0, sizeof(int) * wpl * h, 0, nullptr, nullptr); + + // Second step: Open Operation - Erode followed by Dilate + pixtemp = pixsCLBuffer; + pixsCLBuffer = pixdCLBuffer; + pixdCLBuffer = pixtemp; + + clStatus = pixOpenCL(open_hsize, open_vsize, wpl, h); + + // Third step: Subtract : (Close - Open) + pixtemp = pixsCLBuffer; + pixsCLBuffer = pixdCLBuffer; + pixdCLBuffer = pixdCLIntermediate; + pixdCLIntermediate = pixtemp; + + clStatus = pixSubtractCL_work(wpl, h, pixdCLBuffer, pixsCLBuffer); + + // Store the output of Hollow operation in an intermediate buffer + // this will be later used + clStatus = + clEnqueueCopyBuffer(rEnv.mpkCmdQueue, pixdCLBuffer, pixdCLIntermediate, 0, + 0, sizeof(int) * wpl * h, 0, nullptr, nullptr); + + pixtemp = pixsCLBuffer; + pixsCLBuffer = pixdCLBuffer; + pixdCLBuffer = pixtemp; + + // Fourth step: Get vertical line + // pixOpenBrick(nullptr, pix_hollow, 1, min_line_length); + clStatus = pixOpenCL(1, line_vsize, wpl, h); + + // Copy the vertical line output to CPU buffer + *pix_vline = mapOutputCLBuffer(rEnv, pixdCLBuffer, *pix_vline, pixs, wpl * h, + CL_MAP_READ, true, false); + + pixtemp = pixsCLBuffer; + pixsCLBuffer = pixdCLIntermediate; + pixdCLIntermediate = pixtemp; + + // Fifth step: Get horizontal line + // pixOpenBrick(nullptr, pix_hollow, min_line_length, 1); + clStatus = pixOpenCL(line_hsize, 1, wpl, h); + + // Copy the horizontal line output to CPU buffer + *pix_hline = mapOutputCLBuffer(rEnv, pixdCLBuffer, *pix_hline, pixs, wpl * h, + CL_MAP_READ, true, true); + + return; +} + +/************************************************************************* + * HistogramRect + * Otsu Thresholding Operations + * histogramAllChannels is laid out as all channel 0, then all channel 1... + * only supports 1 or 4 channels (bytes_per_pixel) + ************************************************************************/ +int OpenclDevice::HistogramRectOCL(unsigned char *imageData, + int bytes_per_pixel, int bytes_per_line, + int left, // always 0 + int top, // always 0 + int width, int height, int kHistogramSize, + int *histogramAllChannels) { + PERF_COUNT_START("HistogramRectOCL") + cl_int clStatus; + int retVal = 0; + KernelEnv histKern; + SetKernelEnv(&histKern); + KernelEnv histRedKern; + SetKernelEnv(&histRedKern); + /* map imagedata to device as read only */ + // USE_HOST_PTR uses onion+ bus which is slowest option; also happens to be + // coherent which we don't need. + // faster option would be to allocate initial image buffer + // using a garlic bus memory type + cl_mem imageBuffer = clCreateBuffer( + histKern.mpkContext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, + width * height * bytes_per_pixel * sizeof(char), imageData, &clStatus); + CHECK_OPENCL(clStatus, "clCreateBuffer imageBuffer"); + + /* setup work group size parameters */ + int block_size = 256; + cl_uint numCUs; + clStatus = clGetDeviceInfo(gpuEnv.mpDevID, CL_DEVICE_MAX_COMPUTE_UNITS, + sizeof(numCUs), &numCUs, nullptr); + CHECK_OPENCL(clStatus, "clCreateBuffer imageBuffer"); + + int requestedOccupancy = 10; + int numWorkGroups = numCUs * requestedOccupancy; + int numThreads = block_size * numWorkGroups; + size_t local_work_size[] = {static_cast(block_size)}; + size_t global_work_size[] = {static_cast(numThreads)}; + size_t red_global_work_size[] = { + static_cast(block_size * kHistogramSize * bytes_per_pixel)}; + + /* map histogramAllChannels as write only */ + + cl_mem histogramBuffer = clCreateBuffer( + histKern.mpkContext, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, + kHistogramSize * bytes_per_pixel * sizeof(int), histogramAllChannels, + &clStatus); + CHECK_OPENCL(clStatus, "clCreateBuffer histogramBuffer"); + + /* intermediate histogram buffer */ + int histRed = 256; + int tmpHistogramBins = kHistogramSize * bytes_per_pixel * histRed; + + cl_mem tmpHistogramBuffer = + clCreateBuffer(histKern.mpkContext, CL_MEM_READ_WRITE, + tmpHistogramBins * sizeof(cl_uint), nullptr, &clStatus); + CHECK_OPENCL(clStatus, "clCreateBuffer tmpHistogramBuffer"); + + /* atomic sync buffer */ + int *zeroBuffer = new int[1]; + zeroBuffer[0] = 0; + cl_mem atomicSyncBuffer = clCreateBuffer( + histKern.mpkContext, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, + sizeof(cl_int), zeroBuffer, &clStatus); + CHECK_OPENCL(clStatus, "clCreateBuffer atomicSyncBuffer"); + delete[] zeroBuffer; + // Create kernel objects based on bytes_per_pixel + if (bytes_per_pixel == 1) { + histKern.mpkKernel = clCreateKernel( + histKern.mpkProgram, "kernel_HistogramRectOneChannel", &clStatus); + CHECK_OPENCL(clStatus, "clCreateKernel kernel_HistogramRectOneChannel"); + + histRedKern.mpkKernel = + clCreateKernel(histRedKern.mpkProgram, + "kernel_HistogramRectOneChannelReduction", &clStatus); + CHECK_OPENCL(clStatus, + "clCreateKernel kernel_HistogramRectOneChannelReduction"); + } else { + histKern.mpkKernel = clCreateKernel( histKern.mpkProgram, "kernel_HistogramRectAllChannels", &clStatus ); + CHECK_OPENCL( clStatus, "clCreateKernel kernel_HistogramRectAllChannels"); + + histRedKern.mpkKernel = clCreateKernel( histRedKern.mpkProgram, "kernel_HistogramRectAllChannelsReduction", &clStatus ); + CHECK_OPENCL( clStatus, "clCreateKernel kernel_HistogramRectAllChannelsReduction"); + } + + void *ptr; + + //Initialize tmpHistogramBuffer buffer + ptr = clEnqueueMapBuffer( + histKern.mpkCmdQueue, tmpHistogramBuffer, CL_TRUE, CL_MAP_WRITE, 0, + tmpHistogramBins * sizeof(cl_uint), 0, nullptr, nullptr, &clStatus); + CHECK_OPENCL( clStatus, "clEnqueueMapBuffer tmpHistogramBuffer"); + + memset(ptr, 0, tmpHistogramBins*sizeof(cl_uint)); + clEnqueueUnmapMemObject(histKern.mpkCmdQueue, tmpHistogramBuffer, ptr, 0, + nullptr, nullptr); + + /* set kernel 1 arguments */ + clStatus = + clSetKernelArg(histKern.mpkKernel, 0, sizeof(cl_mem), &imageBuffer); + CHECK_OPENCL( clStatus, "clSetKernelArg imageBuffer"); + cl_uint numPixels = width*height; + clStatus = + clSetKernelArg(histKern.mpkKernel, 1, sizeof(cl_uint), &numPixels); + CHECK_OPENCL( clStatus, "clSetKernelArg numPixels" ); + clStatus = clSetKernelArg(histKern.mpkKernel, 2, sizeof(cl_mem), + &tmpHistogramBuffer); + CHECK_OPENCL( clStatus, "clSetKernelArg tmpHistogramBuffer"); + + /* set kernel 2 arguments */ + int n = numThreads/bytes_per_pixel; + clStatus = clSetKernelArg(histRedKern.mpkKernel, 0, sizeof(cl_int), &n); + CHECK_OPENCL( clStatus, "clSetKernelArg imageBuffer"); + clStatus = clSetKernelArg(histRedKern.mpkKernel, 1, sizeof(cl_mem), + &tmpHistogramBuffer); + CHECK_OPENCL( clStatus, "clSetKernelArg tmpHistogramBuffer"); + clStatus = clSetKernelArg(histRedKern.mpkKernel, 2, sizeof(cl_mem), + &histogramBuffer); + CHECK_OPENCL( clStatus, "clSetKernelArg histogramBuffer"); + + /* launch histogram */ +PERF_COUNT_SUB("before") +clStatus = clEnqueueNDRangeKernel(histKern.mpkCmdQueue, histKern.mpkKernel, 1, + nullptr, global_work_size, local_work_size, 0, + nullptr, nullptr); +CHECK_OPENCL(clStatus, + "clEnqueueNDRangeKernel kernel_HistogramRectAllChannels"); +clFinish(histKern.mpkCmdQueue); +if (clStatus != 0) { + retVal = -1; + } + /* launch histogram */ + clStatus = clEnqueueNDRangeKernel( + histRedKern.mpkCmdQueue, histRedKern.mpkKernel, 1, nullptr, + red_global_work_size, local_work_size, 0, nullptr, nullptr); + CHECK_OPENCL( clStatus, "clEnqueueNDRangeKernel kernel_HistogramRectAllChannelsReduction" ); + clFinish( histRedKern.mpkCmdQueue ); + if (clStatus != 0) { + retVal = -1; + } + PERF_COUNT_SUB("redKernel") + + /* map results back from gpu */ + ptr = clEnqueueMapBuffer(histRedKern.mpkCmdQueue, histogramBuffer, CL_TRUE, + CL_MAP_READ, 0, + kHistogramSize * bytes_per_pixel * sizeof(int), 0, + nullptr, nullptr, &clStatus); + CHECK_OPENCL( clStatus, "clEnqueueMapBuffer histogramBuffer"); + if (clStatus != 0) { + retVal = -1; + } + clEnqueueUnmapMemObject(histRedKern.mpkCmdQueue, histogramBuffer, ptr, 0, + nullptr, nullptr); + + clReleaseMemObject(histogramBuffer); + clReleaseMemObject(imageBuffer); +PERF_COUNT_SUB("after") +PERF_COUNT_END +return retVal; +} + +/************************************************************************* + * Threshold the rectangle, taking everything except the image buffer pointer + * from the class, using thresholds/hi_values to the output IMAGE. + * only supports 1 or 4 channels + ************************************************************************/ +int OpenclDevice::ThresholdRectToPixOCL(unsigned char *imageData, + int bytes_per_pixel, int bytes_per_line, + int *thresholds, int *hi_values, + Pix **pix, int height, int width, + int top, int left) { + PERF_COUNT_START("ThresholdRectToPixOCL") + int retVal = 0; + /* create pix result buffer */ + *pix = pixCreate(width, height, 1); + uint32_t *pixData = pixGetData(*pix); + int wpl = pixGetWpl(*pix); + int pixSize = wpl * height * sizeof(uint32_t); // number of pixels + + cl_int clStatus; + KernelEnv rEnv; + SetKernelEnv(&rEnv); + + /* setup work group size parameters */ + int block_size = 256; + cl_uint numCUs = 6; + clStatus = clGetDeviceInfo(gpuEnv.mpDevID, CL_DEVICE_MAX_COMPUTE_UNITS, + sizeof(numCUs), &numCUs, nullptr); + CHECK_OPENCL(clStatus, "clCreateBuffer imageBuffer"); + + int requestedOccupancy = 10; + int numWorkGroups = numCUs * requestedOccupancy; + int numThreads = block_size * numWorkGroups; + size_t local_work_size[] = {(size_t)block_size}; + size_t global_work_size[] = {(size_t)numThreads}; + + /* map imagedata to device as read only */ + // USE_HOST_PTR uses onion+ bus which is slowest option; also happens to be + // coherent which we don't need. + // faster option would be to allocate initial image buffer + // using a garlic bus memory type + cl_mem imageBuffer = clCreateBuffer( + rEnv.mpkContext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, + width * height * bytes_per_pixel * sizeof(char), imageData, &clStatus); + CHECK_OPENCL(clStatus, "clCreateBuffer imageBuffer"); + + /* map pix as write only */ + pixThBuffer = + clCreateBuffer(rEnv.mpkContext, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, + pixSize, pixData, &clStatus); + CHECK_OPENCL(clStatus, "clCreateBuffer pix"); + + /* map thresholds and hi_values */ + cl_mem thresholdsBuffer = + clCreateBuffer(rEnv.mpkContext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, + bytes_per_pixel * sizeof(int), thresholds, &clStatus); + CHECK_OPENCL(clStatus, "clCreateBuffer thresholdBuffer"); + cl_mem hiValuesBuffer = + clCreateBuffer(rEnv.mpkContext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, + bytes_per_pixel * sizeof(int), hi_values, &clStatus); + CHECK_OPENCL(clStatus, "clCreateBuffer hiValuesBuffer"); + + /* compile kernel */ + if (bytes_per_pixel == 4) { + rEnv.mpkKernel = + clCreateKernel(rEnv.mpkProgram, "kernel_ThresholdRectToPix", &clStatus); + CHECK_OPENCL(clStatus, "clCreateKernel kernel_ThresholdRectToPix"); + } else { + rEnv.mpkKernel = clCreateKernel( + rEnv.mpkProgram, "kernel_ThresholdRectToPix_OneChan", &clStatus); + CHECK_OPENCL(clStatus, "clCreateKernel kernel_ThresholdRectToPix_OneChan"); + } + + /* set kernel arguments */ + clStatus = clSetKernelArg(rEnv.mpkKernel, 0, sizeof(cl_mem), &imageBuffer); + CHECK_OPENCL(clStatus, "clSetKernelArg imageBuffer"); + clStatus = clSetKernelArg(rEnv.mpkKernel, 1, sizeof(int), &height); + CHECK_OPENCL(clStatus, "clSetKernelArg height"); + clStatus = clSetKernelArg(rEnv.mpkKernel, 2, sizeof(int), &width); + CHECK_OPENCL(clStatus, "clSetKernelArg width"); + clStatus = clSetKernelArg(rEnv.mpkKernel, 3, sizeof(int), &wpl); + CHECK_OPENCL(clStatus, "clSetKernelArg wpl"); + clStatus = + clSetKernelArg(rEnv.mpkKernel, 4, sizeof(cl_mem), &thresholdsBuffer); + CHECK_OPENCL(clStatus, "clSetKernelArg thresholdsBuffer"); + clStatus = clSetKernelArg(rEnv.mpkKernel, 5, sizeof(cl_mem), &hiValuesBuffer); + CHECK_OPENCL(clStatus, "clSetKernelArg hiValuesBuffer"); + clStatus = clSetKernelArg(rEnv.mpkKernel, 6, sizeof(cl_mem), &pixThBuffer); + CHECK_OPENCL(clStatus, "clSetKernelArg pixThBuffer"); + + /* launch kernel & wait */ + PERF_COUNT_SUB("before") + clStatus = clEnqueueNDRangeKernel(rEnv.mpkCmdQueue, rEnv.mpkKernel, 1, + nullptr, global_work_size, local_work_size, + 0, nullptr, nullptr); + CHECK_OPENCL(clStatus, "clEnqueueNDRangeKernel kernel_ThresholdRectToPix"); + clFinish(rEnv.mpkCmdQueue); + PERF_COUNT_SUB("kernel") + if (clStatus != 0) { + printf("Setting return value to -1\n"); + retVal = -1; + } + /* map results back from gpu */ + void *ptr = + clEnqueueMapBuffer(rEnv.mpkCmdQueue, pixThBuffer, CL_TRUE, CL_MAP_READ, 0, + pixSize, 0, nullptr, nullptr, &clStatus); + CHECK_OPENCL(clStatus, "clEnqueueMapBuffer histogramBuffer"); + clEnqueueUnmapMemObject(rEnv.mpkCmdQueue, pixThBuffer, ptr, 0, nullptr, + nullptr); + + clReleaseMemObject(imageBuffer); + clReleaseMemObject(thresholdsBuffer); + clReleaseMemObject(hiValuesBuffer); + + PERF_COUNT_SUB("after") + PERF_COUNT_END + return retVal; +} + + + +/****************************************************************************** + * Data Types for Device Selection + *****************************************************************************/ + +typedef struct _TessScoreEvaluationInputData { + int height; + int width; + int numChannels; + unsigned char *imageData; + Pix *pix; +} TessScoreEvaluationInputData; + +static void populateTessScoreEvaluationInputData( + TessScoreEvaluationInputData *input) { + srand(1); + // 8.5x11 inches @ 300dpi rounded to clean multiples + int height = 3328; // %256 + int width = 2560; // %512 + int numChannels = 4; + input->height = height; + input->width = width; + input->numChannels = numChannels; + unsigned char(*imageData4)[4] = (unsigned char(*)[4])malloc( + height * width * numChannels * + sizeof(unsigned char)); // new unsigned char[4][height*width]; + input->imageData = (unsigned char *)&imageData4[0]; + + // zero out image + unsigned char pixelWhite[4] = {0, 0, 0, 255}; + unsigned char pixelBlack[4] = {255, 255, 255, 255}; + for (int p = 0; p < height * width; p++) { + // unsigned char tmp[4] = imageData4[0]; + imageData4[p][0] = pixelWhite[0]; + imageData4[p][1] = pixelWhite[1]; + imageData4[p][2] = pixelWhite[2]; + imageData4[p][3] = pixelWhite[3]; + } + // random lines to be eliminated + int maxLineWidth = 64; // pixels wide + int numLines = 10; + // vertical lines + for (int i = 0; i < numLines; i++) { + int lineWidth = rand() % maxLineWidth; + int vertLinePos = lineWidth + rand() % (width - 2 * lineWidth); + // printf("[PI] VerticalLine @ %i (w=%i)\n", vertLinePos, lineWidth); + for (int row = vertLinePos - lineWidth / 2; + row < vertLinePos + lineWidth / 2; row++) { + for (int col = 0; col < height; col++) { + // imageData4[row*width+col] = pixelBlack; + imageData4[row * width + col][0] = pixelBlack[0]; + imageData4[row * width + col][1] = pixelBlack[1]; + imageData4[row * width + col][2] = pixelBlack[2]; + imageData4[row * width + col][3] = pixelBlack[3]; + } + } + } + // horizontal lines + for (int i = 0; i < numLines; i++) { + int lineWidth = rand() % maxLineWidth; + int horLinePos = lineWidth + rand() % (height - 2 * lineWidth); + // printf("[PI] HorizontalLine @ %i (w=%i)\n", horLinePos, lineWidth); + for (int row = 0; row < width; row++) { + for (int col = horLinePos - lineWidth / 2; + col < horLinePos + lineWidth / 2; + col++) { // for (int row = vertLinePos-lineWidth/2; row < + // vertLinePos+lineWidth/2; row++) { + // printf("[PI] HoizLine pix @ (%3i, %3i)\n", row, col); + // imageData4[row*width+col] = pixelBlack; + imageData4[row * width + col][0] = pixelBlack[0]; + imageData4[row * width + col][1] = pixelBlack[1]; + imageData4[row * width + col][2] = pixelBlack[2]; + imageData4[row * width + col][3] = pixelBlack[3]; + } + } + } + // spots (noise, squares) + float fractionBlack = 0.1; // how much of the image should be blackened + int numSpots = + (height * width) * fractionBlack / (maxLineWidth * maxLineWidth / 2 / 2); + for (int i = 0; i < numSpots; i++) { + int lineWidth = rand() % maxLineWidth; + int col = lineWidth + rand() % (width - 2 * lineWidth); + int row = lineWidth + rand() % (height - 2 * lineWidth); + // printf("[PI] Spot[%i/%i] @ (%3i, %3i)\n", i, numSpots, row, col ); + for (int r = row - lineWidth / 2; r < row + lineWidth / 2; r++) { + for (int c = col - lineWidth / 2; c < col + lineWidth / 2; c++) { + // printf("[PI] \tSpot[%i/%i] @ (%3i, %3i)\n", i, numSpots, r, c ); + // imageData4[row*width+col] = pixelBlack; + imageData4[r * width + c][0] = pixelBlack[0]; + imageData4[r * width + c][1] = pixelBlack[1]; + imageData4[r * width + c][2] = pixelBlack[2]; + imageData4[r * width + c][3] = pixelBlack[3]; + } + } + } + + input->pix = pixCreate(input->width, input->height, 1); +} + +typedef struct _TessDeviceScore { + float time; // small time means faster device + bool clError; // were there any opencl errors + bool valid; // was the correct response generated +} TessDeviceScore; + +/****************************************************************************** + * Micro Benchmarks for Device Selection + *****************************************************************************/ + +static double composeRGBPixelMicroBench(GPUEnv *env, + TessScoreEvaluationInputData input, + ds_device_type type) { + double time = 0; +#if ON_WINDOWS + LARGE_INTEGER freq, time_funct_start, time_funct_end; + QueryPerformanceFrequency(&freq); +#elif ON_APPLE + mach_timebase_info_data_t info = {0, 0}; + mach_timebase_info(&info); + long long start, stop; +#else + timespec time_funct_start, time_funct_end; +#endif + // input data + l_uint32 *tiffdata = (l_uint32 *)input.imageData;// same size and random data; data doesn't change workload + + // function call + if (type == DS_DEVICE_OPENCL_DEVICE) { +#if ON_WINDOWS + QueryPerformanceCounter(&time_funct_start); +#elif ON_APPLE + start = mach_absolute_time(); +#else + clock_gettime( CLOCK_MONOTONIC, &time_funct_start ); +#endif + + OpenclDevice::gpuEnv = *env; + int wpl = pixGetWpl(input.pix); + OpenclDevice::pixReadFromTiffKernel(tiffdata, input.width, input.height, + wpl, nullptr); +#if ON_WINDOWS + QueryPerformanceCounter(&time_funct_end); + time = (time_funct_end.QuadPart-time_funct_start.QuadPart)/(double)(freq.QuadPart); +#elif ON_APPLE + stop = mach_absolute_time(); + time = ((stop - start) * (double)info.numer / info.denom) / 1.0E9; +#else + clock_gettime( CLOCK_MONOTONIC, &time_funct_end ); + time = (time_funct_end.tv_sec - time_funct_start.tv_sec)*1.0 + (time_funct_end.tv_nsec - time_funct_start.tv_nsec)/1000000000.0; +#endif + + } else { +#if ON_WINDOWS + QueryPerformanceCounter(&time_funct_start); +#elif ON_APPLE + start = mach_absolute_time(); +#else + clock_gettime( CLOCK_MONOTONIC, &time_funct_start ); +#endif + Pix *pix = pixCreate(input.width, input.height, 32); + l_uint32 *pixData = pixGetData(pix); + int i, j; + int idx = 0; + for (i = 0; i < input.height ; i++) { + for (j = 0; j < input.width; j++) { + l_uint32 tiffword = tiffdata[i * input.width + j]; + l_int32 rval = ((tiffword) & 0xff); + l_int32 gval = (((tiffword) >> 8) & 0xff); + l_int32 bval = (((tiffword) >> 16) & 0xff); + l_uint32 value = (rval << 24) | (gval << 16) | (bval << 8); + pixData[idx] = value; + idx++; + } + } +#if ON_WINDOWS + QueryPerformanceCounter(&time_funct_end); + time = (time_funct_end.QuadPart-time_funct_start.QuadPart)/(double)(freq.QuadPart); +#elif ON_APPLE + stop = mach_absolute_time(); + time = ((stop - start) * (double)info.numer / info.denom) / 1.0E9; +#else + clock_gettime( CLOCK_MONOTONIC, &time_funct_end ); + time = (time_funct_end.tv_sec - time_funct_start.tv_sec)*1.0 + (time_funct_end.tv_nsec - time_funct_start.tv_nsec)/1000000000.0; +#endif + pixDestroy(&pix); + } + + + // cleanup + + return time; +} + +static double histogramRectMicroBench(GPUEnv *env, + TessScoreEvaluationInputData input, + ds_device_type type) { + double time; +#if ON_WINDOWS + LARGE_INTEGER freq, time_funct_start, time_funct_end; + QueryPerformanceFrequency(&freq); +#elif ON_APPLE + mach_timebase_info_data_t info = {0, 0}; + mach_timebase_info(&info); + long long start, stop; +#else + timespec time_funct_start, time_funct_end; +#endif + + int left = 0; + int top = 0; + int kHistogramSize = 256; + int bytes_per_line = input.width*input.numChannels; + int *histogramAllChannels = new int[kHistogramSize*input.numChannels]; + // function call + if (type == DS_DEVICE_OPENCL_DEVICE) { +#if ON_WINDOWS + QueryPerformanceCounter(&time_funct_start); +#elif ON_APPLE + start = mach_absolute_time(); +#else + clock_gettime( CLOCK_MONOTONIC, &time_funct_start ); +#endif + + OpenclDevice::gpuEnv = *env; + int retVal = OpenclDevice::HistogramRectOCL( + input.imageData, input.numChannels, bytes_per_line, top, left, + input.width, input.height, kHistogramSize, histogramAllChannels); + +#if ON_WINDOWS + QueryPerformanceCounter(&time_funct_end); + time = (time_funct_end.QuadPart-time_funct_start.QuadPart)/(double)(freq.QuadPart); +#elif ON_APPLE + stop = mach_absolute_time(); + if (retVal == 0) { + time = ((stop - start) * (double)info.numer / info.denom) / 1.0E9; + } else { + time = FLT_MAX; + } +#else + clock_gettime( CLOCK_MONOTONIC, &time_funct_end ); + time = (time_funct_end.tv_sec - time_funct_start.tv_sec)*1.0 + (time_funct_end.tv_nsec - time_funct_start.tv_nsec)/1000000000.0; +#endif + } else { + int *histogram = new int[kHistogramSize]; +#if ON_WINDOWS + QueryPerformanceCounter(&time_funct_start); +#elif ON_APPLE + start = mach_absolute_time(); +#else + clock_gettime( CLOCK_MONOTONIC, &time_funct_start ); +#endif + for (int ch = 0; ch < input.numChannels; ++ch) { + tesseract::HistogramRect(input.pix, input.numChannels, left, top, + input.width, input.height, histogram); + } +#if ON_WINDOWS + QueryPerformanceCounter(&time_funct_end); + time = (time_funct_end.QuadPart-time_funct_start.QuadPart)/(double)(freq.QuadPart); +#elif ON_APPLE + stop = mach_absolute_time(); + time = ((stop - start) * (double)info.numer / info.denom) / 1.0E9; +#else + clock_gettime( CLOCK_MONOTONIC, &time_funct_end ); + time = (time_funct_end.tv_sec - time_funct_start.tv_sec)*1.0 + (time_funct_end.tv_nsec - time_funct_start.tv_nsec)/1000000000.0; +#endif + delete[] histogram; + } + + // cleanup + delete[] histogramAllChannels; + return time; +} + +//Reproducing the ThresholdRectToPix native version +static void ThresholdRectToPix_Native(const unsigned char *imagedata, + int bytes_per_pixel, int bytes_per_line, + const int *thresholds, + const int *hi_values, Pix **pix) { + int top = 0; + int left = 0; + int width = pixGetWidth(*pix); + int height = pixGetHeight(*pix); + + *pix = pixCreate(width, height, 1); + uint32_t *pixdata = pixGetData(*pix); + int wpl = pixGetWpl(*pix); + const unsigned char* srcdata = imagedata + top * bytes_per_line + + left * bytes_per_pixel; + for (int y = 0; y < height; ++y) { + const uint8_t *linedata = srcdata; + uint32_t *pixline = pixdata + y * wpl; + for (int x = 0; x < width; ++x, linedata += bytes_per_pixel) { + bool white_result = true; + for (int ch = 0; ch < bytes_per_pixel; ++ch) { + if (hi_values[ch] >= 0 && + (linedata[ch] > thresholds[ch]) == (hi_values[ch] == 0)) { + white_result = false; + break; + } + } + if (white_result) + CLEAR_DATA_BIT(pixline, x); + else + SET_DATA_BIT(pixline, x); + } + srcdata += bytes_per_line; + } +} + +static double thresholdRectToPixMicroBench(GPUEnv *env, + TessScoreEvaluationInputData input, + ds_device_type type) { + double time; +#if ON_WINDOWS + LARGE_INTEGER freq, time_funct_start, time_funct_end; + QueryPerformanceFrequency(&freq); +#elif ON_APPLE + mach_timebase_info_data_t info = {0, 0}; + mach_timebase_info(&info); + long long start, stop; +#else + timespec time_funct_start, time_funct_end; +#endif + + // input data + unsigned char pixelHi = (unsigned char)255; + int* thresholds = new int[4]; + thresholds[0] = pixelHi/2; + thresholds[1] = pixelHi/2; + thresholds[2] = pixelHi/2; + thresholds[3] = pixelHi/2; + int *hi_values = new int[4]; + thresholds[0] = pixelHi; + thresholds[1] = pixelHi; + thresholds[2] = pixelHi; + thresholds[3] = pixelHi; + //Pix* pix = pixCreate(width, height, 1); + int top = 0; + int left = 0; + int bytes_per_line = input.width*input.numChannels; + + // function call + if (type == DS_DEVICE_OPENCL_DEVICE) { +#if ON_WINDOWS + QueryPerformanceCounter(&time_funct_start); +#elif ON_APPLE + start = mach_absolute_time(); +#else + clock_gettime( CLOCK_MONOTONIC, &time_funct_start ); +#endif + + OpenclDevice::gpuEnv = *env; + int retVal = OpenclDevice::ThresholdRectToPixOCL( + input.imageData, input.numChannels, bytes_per_line, thresholds, + hi_values, &input.pix, input.height, input.width, top, left); + +#if ON_WINDOWS + QueryPerformanceCounter(&time_funct_end); + time = (time_funct_end.QuadPart-time_funct_start.QuadPart)/(double)(freq.QuadPart); +#elif ON_APPLE + stop = mach_absolute_time(); + if (retVal == 0) { + time = ((stop - start) * (double)info.numer / info.denom) / 1.0E9; + ; + } else { + time = FLT_MAX; + } + +#else + clock_gettime( CLOCK_MONOTONIC, &time_funct_end ); + time = (time_funct_end.tv_sec - time_funct_start.tv_sec)*1.0 + (time_funct_end.tv_nsec - time_funct_start.tv_nsec)/1000000000.0; +#endif + } else { + + + tesseract::ImageThresholder thresholder; + thresholder.SetImage( input.pix ); +#if ON_WINDOWS + QueryPerformanceCounter(&time_funct_start); +#elif ON_APPLE + start = mach_absolute_time(); +#else + clock_gettime( CLOCK_MONOTONIC, &time_funct_start ); +#endif + ThresholdRectToPix_Native( input.imageData, input.numChannels, bytes_per_line, + thresholds, hi_values, &input.pix ); + +#if ON_WINDOWS + QueryPerformanceCounter(&time_funct_end); + time = (time_funct_end.QuadPart-time_funct_start.QuadPart)/(double)(freq.QuadPart); +#elif ON_APPLE + stop = mach_absolute_time(); + time = ((stop - start) * (double)info.numer / info.denom) / 1.0E9; +#else + clock_gettime( CLOCK_MONOTONIC, &time_funct_end ); + time = (time_funct_end.tv_sec - time_funct_start.tv_sec)*1.0 + (time_funct_end.tv_nsec - time_funct_start.tv_nsec)/1000000000.0; +#endif + } + + // cleanup + delete[] thresholds; + delete[] hi_values; + return time; +} + +static double getLineMasksMorphMicroBench(GPUEnv *env, + TessScoreEvaluationInputData input, + ds_device_type type) { + double time = 0; +#if ON_WINDOWS + LARGE_INTEGER freq, time_funct_start, time_funct_end; + QueryPerformanceFrequency(&freq); +#elif ON_APPLE + mach_timebase_info_data_t info = {0, 0}; + mach_timebase_info(&info); + long long start, stop; +#else + timespec time_funct_start, time_funct_end; +#endif + + // input data + int resolution = 300; + int wpl = pixGetWpl(input.pix); + int kThinLineFraction = 20; // tess constant + int kMinLineLengthFraction = 4; // tess constant + int max_line_width = resolution / kThinLineFraction; + int min_line_length = resolution / kMinLineLengthFraction; + int closing_brick = max_line_width / 3; + + // function call + if (type == DS_DEVICE_OPENCL_DEVICE) { +#if ON_WINDOWS + QueryPerformanceCounter(&time_funct_start); +#elif ON_APPLE + start = mach_absolute_time(); +#else + clock_gettime( CLOCK_MONOTONIC, &time_funct_start ); +#endif + OpenclDevice::gpuEnv = *env; + OpenclDevice::initMorphCLAllocations(wpl, input.height, input.pix); + Pix *pix_vline = nullptr, *pix_hline = nullptr, *pix_closed = nullptr; + OpenclDevice::pixGetLinesCL( + nullptr, input.pix, &pix_vline, &pix_hline, &pix_closed, true, + closing_brick, closing_brick, max_line_width, max_line_width, + min_line_length, min_line_length); + + OpenclDevice::releaseMorphCLBuffers(); + +#if ON_WINDOWS + QueryPerformanceCounter(&time_funct_end); + time = (time_funct_end.QuadPart-time_funct_start.QuadPart)/(double)(freq.QuadPart); +#elif ON_APPLE + stop = mach_absolute_time(); + time = ((stop - start) * (double)info.numer / info.denom) / 1.0E9; +#else + clock_gettime( CLOCK_MONOTONIC, &time_funct_end ); + time = (time_funct_end.tv_sec - time_funct_start.tv_sec)*1.0 + (time_funct_end.tv_nsec - time_funct_start.tv_nsec)/1000000000.0; +#endif + } else { +#if ON_WINDOWS + QueryPerformanceCounter(&time_funct_start); +#elif ON_APPLE + start = mach_absolute_time(); +#else + clock_gettime( CLOCK_MONOTONIC, &time_funct_start ); +#endif + + // native serial code + Pix *src_pix = input.pix; + Pix *pix_closed = + pixCloseBrick(nullptr, src_pix, closing_brick, closing_brick); + Pix *pix_solid = + pixOpenBrick(nullptr, pix_closed, max_line_width, max_line_width); + Pix *pix_hollow = pixSubtract(nullptr, pix_closed, pix_solid); + pixDestroy(&pix_solid); + Pix *pix_vline = pixOpenBrick(nullptr, pix_hollow, 1, min_line_length); + Pix *pix_hline = pixOpenBrick(nullptr, pix_hollow, min_line_length, 1); + pixDestroy(&pix_hollow); + +#if ON_WINDOWS + QueryPerformanceCounter(&time_funct_end); + time = (time_funct_end.QuadPart-time_funct_start.QuadPart)/(double)(freq.QuadPart); +#elif ON_APPLE + stop = mach_absolute_time(); + time = ((stop - start) * (double)info.numer / info.denom) / 1.0E9; +#else + clock_gettime( CLOCK_MONOTONIC, &time_funct_end ); + time = (time_funct_end.tv_sec - time_funct_start.tv_sec)*1.0 + (time_funct_end.tv_nsec - time_funct_start.tv_nsec)/1000000000.0; +#endif + } + + return time; +} + + + +/****************************************************************************** + * Device Selection + *****************************************************************************/ + +#include "stdlib.h" + +// encode score object as byte string +static ds_status serializeScore(ds_device *device, void **serializedScore, + unsigned int *serializedScoreSize) { + *serializedScoreSize = sizeof(TessDeviceScore); + *serializedScore = new unsigned char[*serializedScoreSize]; + memcpy(*serializedScore, device->score, *serializedScoreSize); + return DS_SUCCESS; +} + +// parses byte string and stores in score object +static ds_status deserializeScore(ds_device *device, + const unsigned char *serializedScore, + unsigned int serializedScoreSize) { + // check that serializedScoreSize == sizeof(TessDeviceScore); + device->score = new TessDeviceScore; + memcpy(device->score, serializedScore, serializedScoreSize); + return DS_SUCCESS; +} + +static ds_status releaseScore(void *score) { + delete (TessDeviceScore *)score; + return DS_SUCCESS; +} + +// evaluate devices +static ds_status evaluateScoreForDevice(ds_device *device, void *inputData) { + // overwrite statuc gpuEnv w/ current device + // so native opencl calls can be used; they use static gpuEnv + printf("\n[DS] Device: \"%s\" (%s) evaluation...\n", device->oclDeviceName, + device->type == DS_DEVICE_OPENCL_DEVICE ? "OpenCL" : "Native"); + GPUEnv *env = nullptr; + if (device->type == DS_DEVICE_OPENCL_DEVICE) { + env = new GPUEnv; + // printf("[DS] populating tmp GPUEnv from device\n"); + populateGPUEnvFromDevice(env, device->oclDeviceID); + env->mnFileCount = 0; // argc; + env->mnKernelCount = 0UL; + // printf("[DS] compiling kernels for tmp GPUEnv\n"); + OpenclDevice::gpuEnv = *env; + OpenclDevice::CompileKernelFile(env, ""); + } + + TessScoreEvaluationInputData *input = + static_cast(inputData); + + // pixReadTiff + double composeRGBPixelTime = + composeRGBPixelMicroBench(env, *input, device->type); + + // HistogramRect + double histogramRectTime = histogramRectMicroBench(env, *input, device->type); + + // ThresholdRectToPix + double thresholdRectToPixTime = + thresholdRectToPixMicroBench(env, *input, device->type); + + // getLineMasks + double getLineMasksMorphTime = + getLineMasksMorphMicroBench(env, *input, device->type); + + // weigh times (% of cpu time) + // these weights should be the % execution time that the native cpu code took + float composeRGBPixelWeight = 1.2f; + float histogramRectWeight = 2.4f; + float thresholdRectToPixWeight = 4.5f; + float getLineMasksMorphWeight = 5.0f; + + float weightedTime = composeRGBPixelWeight * composeRGBPixelTime + + histogramRectWeight * histogramRectTime + + thresholdRectToPixWeight * thresholdRectToPixTime + + getLineMasksMorphWeight * getLineMasksMorphTime; + device->score = new TessDeviceScore; + ((TessDeviceScore *)device->score)->time = weightedTime; + + printf("[DS] Device: \"%s\" (%s) evaluated\n", device->oclDeviceName, + device->type == DS_DEVICE_OPENCL_DEVICE ? "OpenCL" : "Native"); + printf("[DS]%25s: %f (w=%.1f)\n", "composeRGBPixel", composeRGBPixelTime, + composeRGBPixelWeight); + printf("[DS]%25s: %f (w=%.1f)\n", "HistogramRect", histogramRectTime, + histogramRectWeight); + printf("[DS]%25s: %f (w=%.1f)\n", "ThresholdRectToPix", + thresholdRectToPixTime, thresholdRectToPixWeight); + printf("[DS]%25s: %f (w=%.1f)\n", "getLineMasksMorph", getLineMasksMorphTime, + getLineMasksMorphWeight); + printf("[DS]%25s: %f\n", "Score", + static_cast(device->score)->time); + return DS_SUCCESS; +} + +// initial call to select device +ds_device OpenclDevice::getDeviceSelection( ) { + if (!deviceIsSelected) { + PERF_COUNT_START("getDeviceSelection") + // check if opencl is available at runtime + if (1 == LoadOpencl()) { + // opencl is available + // PERF_COUNT_SUB("LoadOpencl") + // setup devices + ds_status status; + ds_profile *profile; + status = initDSProfile(&profile, "v0.1"); + PERF_COUNT_SUB("initDSProfile") + // try reading scores from file + const char *fileName = "tesseract_opencl_profile_devices.dat"; + status = readProfileFromFile(profile, deserializeScore, fileName); + if (status != DS_SUCCESS) { + // need to run evaluation + printf("[DS] Profile file not available (%s); performing profiling.\n", + fileName); + + // create input data + TessScoreEvaluationInputData input; + populateTessScoreEvaluationInputData(&input); + // PERF_COUNT_SUB("populateTessScoreEvaluationInputData") + // perform evaluations + unsigned int numUpdates; + status = profileDevices(profile, DS_EVALUATE_ALL, + evaluateScoreForDevice, &input, &numUpdates); + PERF_COUNT_SUB("profileDevices") + // write scores to file + if (status == DS_SUCCESS) { + status = writeProfileToFile(profile, serializeScore, fileName); + PERF_COUNT_SUB("writeProfileToFile") + if (status == DS_SUCCESS) { + printf("[DS] Scores written to file (%s).\n", fileName); + } else { + printf( + "[DS] Error saving scores to file (%s); scores not written to " + "file.\n", + fileName); + } + } else { + printf( + "[DS] Unable to evaluate performance; scores not written to " + "file.\n"); + } + } else { + PERF_COUNT_SUB("readProfileFromFile") + printf("[DS] Profile read from file (%s).\n", fileName); + } + + // we now have device scores either from file or evaluation + // select fastest using custom Tesseract selection algorithm + float bestTime = FLT_MAX; // begin search with worst possible time + int bestDeviceIdx = -1; + for (unsigned d = 0; d < profile->numDevices; d++) { + ds_device device = profile->devices[d]; + TessDeviceScore score = *(TessDeviceScore *)device.score; + + float time = score.time; + printf("[DS] Device[%u] %i:%s score is %f\n", d + 1, device.type, + device.oclDeviceName, time); + if (time < bestTime) { + bestTime = time; + bestDeviceIdx = d; + } + } + printf("[DS] Selected Device[%i]: \"%s\" (%s)\n", bestDeviceIdx + 1, + profile->devices[bestDeviceIdx].oclDeviceName, + profile->devices[bestDeviceIdx].type == DS_DEVICE_OPENCL_DEVICE + ? "OpenCL" + : "Native"); + // cleanup + // TODO: call destructor for profile object? + + bool overridden = false; + char *overrideDeviceStr = getenv("TESSERACT_OPENCL_DEVICE"); + if (overrideDeviceStr != nullptr) { + int overrideDeviceIdx = atoi(overrideDeviceStr); + if (overrideDeviceIdx > 0 && overrideDeviceIdx <= profile->numDevices) { + printf( + "[DS] Overriding Device Selection (TESSERACT_OPENCL_DEVICE=%s, " + "%i)\n", + overrideDeviceStr, overrideDeviceIdx); + bestDeviceIdx = overrideDeviceIdx - 1; + overridden = true; + } else { + printf( + "[DS] Ignoring invalid TESSERACT_OPENCL_DEVICE=%s ([1,%i] are " + "valid devices).\n", + overrideDeviceStr, profile->numDevices); + } + } + + if (overridden) { + printf("[DS] Overridden Device[%i]: \"%s\" (%s)\n", bestDeviceIdx + 1, + profile->devices[bestDeviceIdx].oclDeviceName, + profile->devices[bestDeviceIdx].type == DS_DEVICE_OPENCL_DEVICE + ? "OpenCL" + : "Native"); + } + selectedDevice = profile->devices[bestDeviceIdx]; + // cleanup + releaseDSProfile(profile, releaseScore); + } else { + // opencl isn't available at runtime, select native cpu device + printf("[DS] OpenCL runtime not available.\n"); + selectedDevice.type = DS_DEVICE_NATIVE_CPU; + selectedDevice.oclDeviceName = "(null)"; + selectedDevice.score = nullptr; + selectedDevice.oclDeviceID = nullptr; + selectedDevice.oclDriverVersion = nullptr; + } + deviceIsSelected = true; + PERF_COUNT_SUB("select from Profile") + PERF_COUNT_END + } + // PERF_COUNT_END + return selectedDevice; +} + + +bool OpenclDevice::selectedDeviceIsOpenCL() { + ds_device device = getDeviceSelection(); + return (device.type == DS_DEVICE_OPENCL_DEVICE); +} + +#endif diff --git a/src/opencl/openclwrapper.h b/src/opencl/openclwrapper.h index ce684e95fc..5fe1a50023 100644 --- a/src/opencl/openclwrapper.h +++ b/src/opencl/openclwrapper.h @@ -1,293 +1,293 @@ -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef TESSERACT_OPENCL_OPENCLWRAPPER_H_ -#define TESSERACT_OPENCL_OPENCLWRAPPER_H_ - -#include -#include "allheaders.h" -#include "pix.h" -#include "tprintf.h" - -// including CL/cl.h doesn't occur until USE_OPENCL defined below - -// platform preprocessor commands -#if defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || \ - defined(__CYGWIN__) || defined(__MINGW32__) -#define ON_WINDOWS 1 -#define ON_LINUX 0 -#define ON_APPLE 0 -#define ON_OTHER 0 -#define IF_WINDOWS(X) X -#define IF_LINUX(X) -#define IF_APPLE(X) -#define IF_OTHER(X) -#define NOT_WINDOWS(X) -#elif defined( __linux__ ) -#define ON_WINDOWS 0 -#define ON_LINUX 1 -#define ON_APPLE 0 -#define ON_OTHER 0 -#define IF_WINDOWS(X) -#define IF_LINUX(X) X -#define IF_APPLE(X) -#define IF_OTHER(X) -#define NOT_WINDOWS(X) X -#elif defined( __APPLE__ ) -#define ON_WINDOWS 0 -#define ON_LINUX 0 -#define ON_APPLE 1 -#define ON_OTHER 0 -#define IF_WINDOWS(X) -#define IF_LINUX(X) -#define IF_APPLE(X) X -#define IF_OTHER(X) -#define NOT_WINDOWS(X) X -#else -#define ON_WINDOWS 0 -#define ON_LINUX 0 -#define ON_APPLE 0 -#define ON_OTHER 1 -#define IF_WINDOWS(X) -#define IF_LINUX(X) -#define IF_APPLE(X) -#define IF_OTHER(X) X -#define NOT_WINDOWS(X) X -#endif - -#if ON_LINUX -#include -#endif - -/************************************************************************************ - * enable/disable reporting of performance - * PERF_REPORT_LEVEL - * 0 - no reporting - * 1 - no reporting - * 2 - report total function call time for functions we're tracking - * 3 - optionally report breakdown of function calls (kernel launch, kernel time, data copies) - ************************************************************************************/ -#define PERF_COUNT_VERBOSE 1 -#define PERF_COUNT_REPORT_STR "[%36s], %24s, %11.6f\n" - - -#if ON_WINDOWS - -#if PERF_COUNT_VERBOSE >= 2 -#define PERF_COUNT_START(FUNCT_NAME) \ - char *funct_name = FUNCT_NAME; \ - double elapsed_time_sec; \ - LARGE_INTEGER freq, time_funct_start, time_funct_end, time_sub_start, time_sub_end; \ - QueryPerformanceFrequency(&freq); \ - QueryPerformanceCounter(&time_funct_start); \ - time_sub_start = time_funct_start; \ - time_sub_end = time_funct_start; - -#define PERF_COUNT_END \ - QueryPerformanceCounter(&time_funct_end); \ - elapsed_time_sec = (time_funct_end.QuadPart - time_funct_start.QuadPart) / \ - (double)(freq.QuadPart); \ - printf(PERF_COUNT_REPORT_STR, funct_name, "total", elapsed_time_sec); -#else -#define PERF_COUNT_START(FUNCT_NAME) -#define PERF_COUNT_END -#endif - -#if PERF_COUNT_VERBOSE >= 3 -#define PERF_COUNT_SUB(SUB) \ - QueryPerformanceCounter(&time_sub_end); \ - elapsed_time_sec = (time_sub_end.QuadPart - time_sub_start.QuadPart) / \ - (double)(freq.QuadPart); \ - printf(PERF_COUNT_REPORT_STR, funct_name, SUB, elapsed_time_sec); \ - time_sub_start = time_sub_end; -#else -#define PERF_COUNT_SUB(SUB) -#endif - - -// not on windows -#else - -#if PERF_COUNT_VERBOSE >= 2 -#define PERF_COUNT_START(FUNCT_NAME) \ - char *funct_name = FUNCT_NAME; \ - double elapsed_time_sec; \ - timespec time_funct_start, time_funct_end, time_sub_start, time_sub_end; \ - clock_gettime( CLOCK_MONOTONIC, &time_funct_start ); \ - time_sub_start = time_funct_start; \ - time_sub_end = time_funct_start; - -#define PERF_COUNT_END \ - clock_gettime(CLOCK_MONOTONIC, &time_funct_end); \ - elapsed_time_sec = \ - (time_funct_end.tv_sec - time_funct_start.tv_sec) * 1.0 + \ - (time_funct_end.tv_nsec - time_funct_start.tv_nsec) / 1000000000.0; \ - printf(PERF_COUNT_REPORT_STR, funct_name, "total", elapsed_time_sec); -#else -#define PERF_COUNT_START(FUNCT_NAME) -#define PERF_COUNT_END -#endif - -#if PERF_COUNT_VERBOSE >= 3 -#define PERF_COUNT_SUB(SUB) \ - clock_gettime(CLOCK_MONOTONIC, &time_sub_end); \ - elapsed_time_sec = \ - (time_sub_end.tv_sec - time_sub_start.tv_sec) * 1.0 + \ - (time_sub_end.tv_nsec - time_sub_start.tv_nsec) / 1000000000.0; \ - printf(PERF_COUNT_REPORT_STR, funct_name, SUB, elapsed_time_sec); \ - time_sub_start = time_sub_end; -#else -#define PERF_COUNT_SUB(SUB) -#endif - -#endif -/************************************************************************** - * enable/disable use of OpenCL - **************************************************************************/ - -#ifdef USE_OPENCL -#include "opencl_device_selection.h" - -#ifndef strcasecmp -#define strcasecmp strcmp -#endif - -#define MAX_KERNEL_STRING_LEN 64 -#define MAX_CLFILE_NUM 50 -#define MAX_CLKERNEL_NUM 200 -#define MAX_KERNEL_NAME_LEN 64 -#define CL_QUEUE_THREAD_HANDLE_AMD 0x403E -#define GROUPSIZE_X 16 -#define GROUPSIZE_Y 16 -#define GROUPSIZE_HMORX 256 -#define GROUPSIZE_HMORY 1 - -typedef struct _KernelEnv -{ - cl_context mpkContext; - cl_command_queue mpkCmdQueue; - cl_program mpkProgram; - cl_kernel mpkKernel; - char mckKernelName[150]; -} KernelEnv; - -typedef struct _OpenCLEnv -{ - cl_platform_id mpOclPlatformID; - cl_context mpOclContext; - cl_device_id mpOclDevsID; - cl_command_queue mpOclCmdQueue; -} OpenCLEnv; -typedef int ( *cl_kernel_function )( void **userdata, KernelEnv *kenv ); - -#define CHECK_OPENCL(status,name) \ -if( status != CL_SUCCESS ) \ -{ \ - printf ("OpenCL error code is %d at when %s .\n", status, name); \ -} - - -typedef struct _GPUEnv -{ - //share vb in all modules in hb library - cl_platform_id mpPlatformID; - cl_device_type mDevType; - cl_context mpContext; - cl_device_id *mpArryDevsID; - cl_device_id mpDevID; - cl_command_queue mpCmdQueue; - cl_kernel mpArryKernels[MAX_CLFILE_NUM]; - cl_program mpArryPrograms[MAX_CLFILE_NUM]; //one program object maps one kernel source file - char mArryKnelSrcFile[MAX_CLFILE_NUM][256], //the max len of kernel file name is 256 - mArrykernelNames[MAX_CLKERNEL_NUM][MAX_KERNEL_STRING_LEN + 1]; - cl_kernel_function mpArryKnelFuncs[MAX_CLKERNEL_NUM]; - int mnKernelCount, mnFileCount, // only one kernel file - mnIsUserCreated; // 1: created , 0:no create and needed to create by opencl wrapper - int mnKhrFp64Flag; - int mnAmdFp64Flag; - -} GPUEnv; - - -class OpenclDevice -{ - -public: - static GPUEnv gpuEnv; - static int isInited; - OpenclDevice(); - ~OpenclDevice(); - static int InitEnv(); // load dll, call InitOpenclRunEnv(0) - static int InitOpenclRunEnv( int argc ); // RegistOpenclKernel, double flags, compile kernels - static int InitOpenclRunEnv_DeviceSelection( int argc ); // RegistOpenclKernel, double flags, compile kernels - static int RegistOpenclKernel(); - static int ReleaseOpenclRunEnv(); - static int ReleaseOpenclEnv( GPUEnv *gpuInfo ); - static int CompileKernelFile( GPUEnv *gpuInfo, const char *buildOption ); - static int CachedOfKernerPrg( const GPUEnv *gpuEnvCached, const char * clFileName ); - static int GeneratBinFromKernelSource( cl_program program, const char * clFileName ); - static int WriteBinaryToFile( const char* fileName, const char* birary, size_t numBytes ); - static int BinaryGenerated( const char * clFileName, FILE ** fhandle ); - //static int CompileKernelFile( const char *filename, GPUEnv *gpuInfo, const char *buildOption ); - static l_uint32* pixReadFromTiffKernel(l_uint32 *tiffdata,l_int32 w,l_int32 h,l_int32 wpl, l_uint32 *line); - static int composeRGBPixelCl(int *tiffdata,int *line,int h,int w); - -/* OpenCL implementations of Morphological operations*/ - - //Initialiation of OCL buffers used in Morph operations - static int initMorphCLAllocations(l_int32 wpl, l_int32 h, Pix *pixs); - static void releaseMorphCLBuffers(); - - static void pixGetLinesCL(Pix *pixd, Pix *pixs, Pix **pix_vline, - Pix **pix_hline, Pix **pixClosed, - bool getpixClosed, l_int32 close_hsize, - l_int32 close_vsize, l_int32 open_hsize, - l_int32 open_vsize, l_int32 line_hsize, - l_int32 line_vsize); - - //int InitOpenclAttr( OpenCLEnv * env ); - //int ReleaseKernel( KernelEnv * env ); - static int SetKernelEnv( KernelEnv *envInfo ); - //int CreateKernel( char * kernelname, KernelEnv * env ); - //int RunKernel( const char *kernelName, void **userdata ); - //int ConvertToString( const char *filename, char **source ); - //int CheckKernelName( KernelEnv *envInfo, const char *kernelName ); - //int RegisterKernelWrapper( const char *kernelName, cl_kernel_function function ); - //int RunKernelWrapper( cl_kernel_function function, const char * kernelName, void **usrdata ); - //int GetKernelEnvAndFunc( const char *kernelName, KernelEnv *env, cl_kernel_function *function ); - - static int LoadOpencl(); -#ifdef WIN32 - //static int OpenclInite(); - static void FreeOpenclDll(); -#endif - - inline static int AddKernelConfig( int kCount, const char *kName ); - - /* for binarization */ - static int HistogramRectOCL(unsigned char *imagedata, int bytes_per_pixel, - int bytes_per_line, int left, int top, - int width, int height, int kHistogramSize, - int *histogramAllChannels); - - static int ThresholdRectToPixOCL(unsigned char *imagedata, - int bytes_per_pixel, int bytes_per_line, - int *thresholds, int *hi_values, Pix **pix, - int rect_height, int rect_width, - int rect_top, int rect_left); - - static ds_device getDeviceSelection(); - static ds_device selectedDevice; - static bool deviceIsSelected; - static bool selectedDeviceIsOpenCL(); -}; - -#endif // USE_OPENCL -#endif // TESSERACT_OPENCL_OPENCLWRAPPER_H_ +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef TESSERACT_OPENCL_OPENCLWRAPPER_H_ +#define TESSERACT_OPENCL_OPENCLWRAPPER_H_ + +#include +#include "allheaders.h" +#include "pix.h" +#include "tprintf.h" + +// including CL/cl.h doesn't occur until USE_OPENCL defined below + +// platform preprocessor commands +#if defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || \ + defined(__CYGWIN__) || defined(__MINGW32__) +#define ON_WINDOWS 1 +#define ON_LINUX 0 +#define ON_APPLE 0 +#define ON_OTHER 0 +#define IF_WINDOWS(X) X +#define IF_LINUX(X) +#define IF_APPLE(X) +#define IF_OTHER(X) +#define NOT_WINDOWS(X) +#elif defined( __linux__ ) +#define ON_WINDOWS 0 +#define ON_LINUX 1 +#define ON_APPLE 0 +#define ON_OTHER 0 +#define IF_WINDOWS(X) +#define IF_LINUX(X) X +#define IF_APPLE(X) +#define IF_OTHER(X) +#define NOT_WINDOWS(X) X +#elif defined( __APPLE__ ) +#define ON_WINDOWS 0 +#define ON_LINUX 0 +#define ON_APPLE 1 +#define ON_OTHER 0 +#define IF_WINDOWS(X) +#define IF_LINUX(X) +#define IF_APPLE(X) X +#define IF_OTHER(X) +#define NOT_WINDOWS(X) X +#else +#define ON_WINDOWS 0 +#define ON_LINUX 0 +#define ON_APPLE 0 +#define ON_OTHER 1 +#define IF_WINDOWS(X) +#define IF_LINUX(X) +#define IF_APPLE(X) +#define IF_OTHER(X) X +#define NOT_WINDOWS(X) X +#endif + +#if ON_LINUX +#include +#endif + +/************************************************************************************ + * enable/disable reporting of performance + * PERF_REPORT_LEVEL + * 0 - no reporting + * 1 - no reporting + * 2 - report total function call time for functions we're tracking + * 3 - optionally report breakdown of function calls (kernel launch, kernel time, data copies) + ************************************************************************************/ +#define PERF_COUNT_VERBOSE 1 +#define PERF_COUNT_REPORT_STR "[%36s], %24s, %11.6f\n" + + +#if ON_WINDOWS + +#if PERF_COUNT_VERBOSE >= 2 +#define PERF_COUNT_START(FUNCT_NAME) \ + char *funct_name = FUNCT_NAME; \ + double elapsed_time_sec; \ + LARGE_INTEGER freq, time_funct_start, time_funct_end, time_sub_start, time_sub_end; \ + QueryPerformanceFrequency(&freq); \ + QueryPerformanceCounter(&time_funct_start); \ + time_sub_start = time_funct_start; \ + time_sub_end = time_funct_start; + +#define PERF_COUNT_END \ + QueryPerformanceCounter(&time_funct_end); \ + elapsed_time_sec = (time_funct_end.QuadPart - time_funct_start.QuadPart) / \ + (double)(freq.QuadPart); \ + printf(PERF_COUNT_REPORT_STR, funct_name, "total", elapsed_time_sec); +#else +#define PERF_COUNT_START(FUNCT_NAME) +#define PERF_COUNT_END +#endif + +#if PERF_COUNT_VERBOSE >= 3 +#define PERF_COUNT_SUB(SUB) \ + QueryPerformanceCounter(&time_sub_end); \ + elapsed_time_sec = (time_sub_end.QuadPart - time_sub_start.QuadPart) / \ + (double)(freq.QuadPart); \ + printf(PERF_COUNT_REPORT_STR, funct_name, SUB, elapsed_time_sec); \ + time_sub_start = time_sub_end; +#else +#define PERF_COUNT_SUB(SUB) +#endif + + +// not on windows +#else + +#if PERF_COUNT_VERBOSE >= 2 +#define PERF_COUNT_START(FUNCT_NAME) \ + char *funct_name = FUNCT_NAME; \ + double elapsed_time_sec; \ + timespec time_funct_start, time_funct_end, time_sub_start, time_sub_end; \ + clock_gettime( CLOCK_MONOTONIC, &time_funct_start ); \ + time_sub_start = time_funct_start; \ + time_sub_end = time_funct_start; + +#define PERF_COUNT_END \ + clock_gettime(CLOCK_MONOTONIC, &time_funct_end); \ + elapsed_time_sec = \ + (time_funct_end.tv_sec - time_funct_start.tv_sec) * 1.0 + \ + (time_funct_end.tv_nsec - time_funct_start.tv_nsec) / 1000000000.0; \ + printf(PERF_COUNT_REPORT_STR, funct_name, "total", elapsed_time_sec); +#else +#define PERF_COUNT_START(FUNCT_NAME) +#define PERF_COUNT_END +#endif + +#if PERF_COUNT_VERBOSE >= 3 +#define PERF_COUNT_SUB(SUB) \ + clock_gettime(CLOCK_MONOTONIC, &time_sub_end); \ + elapsed_time_sec = \ + (time_sub_end.tv_sec - time_sub_start.tv_sec) * 1.0 + \ + (time_sub_end.tv_nsec - time_sub_start.tv_nsec) / 1000000000.0; \ + printf(PERF_COUNT_REPORT_STR, funct_name, SUB, elapsed_time_sec); \ + time_sub_start = time_sub_end; +#else +#define PERF_COUNT_SUB(SUB) +#endif + +#endif +/************************************************************************** + * enable/disable use of OpenCL + **************************************************************************/ + +#ifdef USE_OPENCL +#include "opencl_device_selection.h" + +#ifndef strcasecmp +#define strcasecmp strcmp +#endif + +#define MAX_KERNEL_STRING_LEN 64 +#define MAX_CLFILE_NUM 50 +#define MAX_CLKERNEL_NUM 200 +#define MAX_KERNEL_NAME_LEN 64 +#define CL_QUEUE_THREAD_HANDLE_AMD 0x403E +#define GROUPSIZE_X 16 +#define GROUPSIZE_Y 16 +#define GROUPSIZE_HMORX 256 +#define GROUPSIZE_HMORY 1 + +typedef struct _KernelEnv +{ + cl_context mpkContext; + cl_command_queue mpkCmdQueue; + cl_program mpkProgram; + cl_kernel mpkKernel; + char mckKernelName[150]; +} KernelEnv; + +typedef struct _OpenCLEnv +{ + cl_platform_id mpOclPlatformID; + cl_context mpOclContext; + cl_device_id mpOclDevsID; + cl_command_queue mpOclCmdQueue; +} OpenCLEnv; +typedef int ( *cl_kernel_function )( void **userdata, KernelEnv *kenv ); + +#define CHECK_OPENCL(status,name) \ +if( status != CL_SUCCESS ) \ +{ \ + printf ("OpenCL error code is %d at when %s .\n", status, name); \ +} + + +typedef struct _GPUEnv +{ + //share vb in all modules in hb library + cl_platform_id mpPlatformID; + cl_device_type mDevType; + cl_context mpContext; + cl_device_id *mpArryDevsID; + cl_device_id mpDevID; + cl_command_queue mpCmdQueue; + cl_kernel mpArryKernels[MAX_CLFILE_NUM]; + cl_program mpArryPrograms[MAX_CLFILE_NUM]; //one program object maps one kernel source file + char mArryKnelSrcFile[MAX_CLFILE_NUM][256], //the max len of kernel file name is 256 + mArrykernelNames[MAX_CLKERNEL_NUM][MAX_KERNEL_STRING_LEN + 1]; + cl_kernel_function mpArryKnelFuncs[MAX_CLKERNEL_NUM]; + int mnKernelCount, mnFileCount, // only one kernel file + mnIsUserCreated; // 1: created , 0:no create and needed to create by opencl wrapper + int mnKhrFp64Flag; + int mnAmdFp64Flag; + +} GPUEnv; + + +class OpenclDevice +{ + +public: + static GPUEnv gpuEnv; + static int isInited; + OpenclDevice(); + ~OpenclDevice(); + static int InitEnv(); // load dll, call InitOpenclRunEnv(0) + static int InitOpenclRunEnv( int argc ); // RegistOpenclKernel, double flags, compile kernels + static int InitOpenclRunEnv_DeviceSelection( int argc ); // RegistOpenclKernel, double flags, compile kernels + static int RegistOpenclKernel(); + static int ReleaseOpenclRunEnv(); + static int ReleaseOpenclEnv( GPUEnv *gpuInfo ); + static int CompileKernelFile( GPUEnv *gpuInfo, const char *buildOption ); + static int CachedOfKernerPrg( const GPUEnv *gpuEnvCached, const char * clFileName ); + static int GeneratBinFromKernelSource( cl_program program, const char * clFileName ); + static int WriteBinaryToFile( const char* fileName, const char* birary, size_t numBytes ); + static int BinaryGenerated( const char * clFileName, FILE ** fhandle ); + //static int CompileKernelFile( const char *filename, GPUEnv *gpuInfo, const char *buildOption ); + static l_uint32* pixReadFromTiffKernel(l_uint32 *tiffdata,l_int32 w,l_int32 h,l_int32 wpl, l_uint32 *line); + static int composeRGBPixelCl(int *tiffdata,int *line,int h,int w); + +/* OpenCL implementations of Morphological operations*/ + + //Initialiation of OCL buffers used in Morph operations + static int initMorphCLAllocations(l_int32 wpl, l_int32 h, Pix *pixs); + static void releaseMorphCLBuffers(); + + static void pixGetLinesCL(Pix *pixd, Pix *pixs, Pix **pix_vline, + Pix **pix_hline, Pix **pixClosed, + bool getpixClosed, l_int32 close_hsize, + l_int32 close_vsize, l_int32 open_hsize, + l_int32 open_vsize, l_int32 line_hsize, + l_int32 line_vsize); + + //int InitOpenclAttr( OpenCLEnv * env ); + //int ReleaseKernel( KernelEnv * env ); + static int SetKernelEnv( KernelEnv *envInfo ); + //int CreateKernel( char * kernelname, KernelEnv * env ); + //int RunKernel( const char *kernelName, void **userdata ); + //int ConvertToString( const char *filename, char **source ); + //int CheckKernelName( KernelEnv *envInfo, const char *kernelName ); + //int RegisterKernelWrapper( const char *kernelName, cl_kernel_function function ); + //int RunKernelWrapper( cl_kernel_function function, const char * kernelName, void **usrdata ); + //int GetKernelEnvAndFunc( const char *kernelName, KernelEnv *env, cl_kernel_function *function ); + + static int LoadOpencl(); +#ifdef WIN32 + //static int OpenclInite(); + static void FreeOpenclDll(); +#endif + + inline static int AddKernelConfig( int kCount, const char *kName ); + + /* for binarization */ + static int HistogramRectOCL(unsigned char *imagedata, int bytes_per_pixel, + int bytes_per_line, int left, int top, + int width, int height, int kHistogramSize, + int *histogramAllChannels); + + static int ThresholdRectToPixOCL(unsigned char *imagedata, + int bytes_per_pixel, int bytes_per_line, + int *thresholds, int *hi_values, Pix **pix, + int rect_height, int rect_width, + int rect_top, int rect_left); + + static ds_device getDeviceSelection(); + static ds_device selectedDevice; + static bool deviceIsSelected; + static bool selectedDeviceIsOpenCL(); +}; + +#endif // USE_OPENCL +#endif // TESSERACT_OPENCL_OPENCLWRAPPER_H_ diff --git a/src/textord/baselinedetect.h b/src/textord/baselinedetect.h index 795d57839d..8d11bdffe0 100644 --- a/src/textord/baselinedetect.h +++ b/src/textord/baselinedetect.h @@ -1,277 +1,277 @@ -/////////////////////////////////////////////////////////////////////// -// File: baselinedetect.h -// Description: Initial Baseline Determination. -// Copyright 2012 Google Inc. All Rights Reserved. -// Author: rays@google.com (Ray Smith) -// Created: Mon Apr 30 10:03:19 PDT 2012 -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -#ifndef TESSERACT_TEXTORD_BASELINEDETECT_H_ -#define TESSERACT_TEXTORD_BASELINEDETECT_H_ - -#include "detlinefit.h" -#include "genericvector.h" -#include "points.h" -#include "rect.h" -#include "strngs.h" - -class BLOBNBOX_LIST; -class TO_BLOCK; -class TO_BLOCK_LIST; -class TO_ROW; -struct Pix; - -namespace tesseract { - -class Textord; - -// Class to compute and hold baseline data for a TO_ROW. -class BaselineRow { - public: - BaselineRow(double line_size, TO_ROW* to_row); - - const TBOX& bounding_box() const { - return bounding_box_; - } - // Sets the TO_ROW with the output straight line. - void SetupOldLineParameters(TO_ROW* row) const; - - // Outputs diagnostic information. - void Print() const; - - // Returns the skew angle (in radians) of the current baseline in [-pi,pi]. - double BaselineAngle() const; - // Computes and returns the linespacing at the middle of the overlap - // between this and other. - double SpaceBetween(const BaselineRow& other) const; - // Computes and returns the displacement of the center of the line - // perpendicular to the given direction. - double PerpDisp(const FCOORD& direction) const; - // Computes the y coordinate at the given x using the straight baseline - // defined by baseline1_ and baseline2_. - double StraightYAtX(double x) const; - - // Fits a straight baseline to the points. Returns true if it had enough - // points to be reasonably sure of the fitted baseline. - // If use_box_bottoms is false, baselines positions are formed by - // considering the outlines of the blobs. - bool FitBaseline(bool use_box_bottoms); - // Modifies an existing result of FitBaseline to be parallel to the given - // vector if that produces a better result. - void AdjustBaselineToParallel(int debug, const FCOORD& direction); - // Modifies the baseline to snap to the textline grid if the existing - // result is not good enough. - double AdjustBaselineToGrid(int debug, const FCOORD& direction, - double line_spacing, double line_offset); - - private: - // Sets up displacement_modes_ with the top few modes of the perpendicular - // distance of each blob from the given direction vector, after rounding. - void SetupBlobDisplacements(const FCOORD& direction); - - // Fits a line in the given direction to blobs that are close to the given - // target_offset perpendicular displacement from the direction. The fit - // error is allowed to be cheat_allowance worse than the existing fit, and - // will still be used. - // If cheat_allowance > 0, the new fit will be good and replace the current - // fit if it has better fit (with cheat) OR its error is below - // max_baseline_error_ and the old fit is marked bad. - // Otherwise the new fit will only replace the old if it is really better, - // or the old fit is marked bad and the new fit has sufficient points, as - // well as being within the max_baseline_error_. - void FitConstrainedIfBetter(int debug, const FCOORD& direction, - double cheat_allowance, - double target_offset); - // Returns the perpendicular distance of the point from the straight - // baseline. - double PerpDistanceFromBaseline(const FCOORD& pt) const; - // Computes the bounding box of the row. - void ComputeBoundingBox(); - - // The blobs of the row to which this BaselineRow adds extra information - // during baseline fitting. Note that blobs_ could easily come from either - // a TO_ROW or a ColPartition. - BLOBNBOX_LIST* blobs_; - // Bounding box of all the blobs. - TBOX bounding_box_; - // Fitter used to fit lines to the blobs. - DetLineFit fitter_; - // 2 points on the straight baseline. - FCOORD baseline_pt1_; - FCOORD baseline_pt2_; - // Set of modes of displacements. They indicate preferable baseline positions. - GenericVector displacement_modes_; - // Quantization factor used for displacement_modes_. - double disp_quant_factor_; - // Half the acceptance range of blob displacements for computing the - // error during a constrained fit. - double fit_halfrange_; - // Max baseline error before a line is regarded as fitting badly. - double max_baseline_error_; - // The error of fit of the baseline. - double baseline_error_; - // True if this row seems to have a good baseline. - bool good_baseline_; -}; - -// Class to compute and hold baseline data for a TO_BLOCK. -class BaselineBlock { - public: - BaselineBlock(int debug_level, bool non_text, TO_BLOCK* block); - - TO_BLOCK* block() const { - return block_; - } - double skew_angle() const { - return skew_angle_; - } - - // Computes and returns the absolute error of the given perp_disp from the - // given linespacing model. - static double SpacingModelError(double perp_disp, double line_spacing, - double line_offset); - - // Fits straight line baselines and computes the skew angle from the - // median angle. Returns true if a good angle is found. - // If use_box_bottoms is false, baseline positions are formed by - // considering the outlines of the blobs. - bool FitBaselinesAndFindSkew(bool use_box_bottoms); - - // Refits the baseline to a constrained angle, using the stored block - // skew if good enough, otherwise the supplied default skew. - void ParallelizeBaselines(double default_block_skew); - - // Sets the parameters in TO_BLOCK that are needed by subsequent processes. - void SetupBlockParameters() const; - - // Processing that is required before fitting baseline splines, but requires - // linear baselines in order to be successful: - // Removes noise if required - // Separates out underlines - // Pre-associates blob fragments. - // TODO(rays/joeliu) This entire section of code is inherited from the past - // and could be improved/eliminated. - // page_tr is used to size a debug window. - void PrepareForSplineFitting(ICOORD page_tr, bool remove_noise); - - // Fits splines to the textlines, or creates fake QSPLINES from the straight - // baselines that are already on the TO_ROWs. - // As a side-effect, computes the xheights of the rows and the block. - // Although x-height estimation is conceptually separate, it is part of - // detecting perspective distortion and therefore baseline fitting. - void FitBaselineSplines(bool enable_splines, bool show_final_rows, - Textord* textord); - - // Draws the (straight) baselines and final blobs colored according to - // what was discarded as noise and what is associated with each row. - void DrawFinalRows(const ICOORD& page_tr); - - // Render the generated spline baselines for this block on pix_in. - void DrawPixSpline(Pix* pix_in); - - private: - // Top-level line-spacing calculation. Computes an estimate of the line- - // spacing, using the current baselines in the TO_ROWS of the block, and - // then refines it by fitting a regression line to the baseline positions - // as a function of their integer index. - // Returns true if it seems that the model is a reasonable fit to the - // observations. - bool ComputeLineSpacing(); - - // Computes the deskewed vertical position of each baseline in the block and - // stores them in the given vector. - void ComputeBaselinePositions(const FCOORD& direction, - GenericVector* positions); - - // Computes an estimate of the line spacing of the block from the median - // of the spacings between adjacent overlapping textlines. - void EstimateLineSpacing(); - - // Refines the line spacing of the block by fitting a regression - // line to the deskewed y-position of each baseline as a function of its - // estimated line index, allowing for a small error in the initial linespacing - // and choosing the best available model. - void RefineLineSpacing(const GenericVector& positions); - - // Given an initial estimate of line spacing (m_in) and the positions of each - // baseline, computes the line spacing of the block more accurately in m_out, - // and the corresponding intercept in c_out, and the number of spacings seen - // in index_delta. Returns the error of fit to the line spacing model. - double FitLineSpacingModel(const GenericVector& positions, - double m_in, double* m_out, double* c_out, - int* index_delta); - - - // The block to which this class adds extra information used during baseline - // calculation. - TO_BLOCK* block_; - // The rows in the block that we will be working with. - PointerVector rows_; - // Amount of debugging output to provide. - int debug_level_; - // True if the block is non-text (graphic). - bool non_text_block_; - // True if the block has at least one good enough baseline to compute the - // skew angle and therefore skew_angle_ is valid. - bool good_skew_angle_; - // Angle of skew in radians using the conventional anticlockwise from x-axis. - double skew_angle_; - // Current best estimate line spacing in pixels perpendicular to skew_angle_. - double line_spacing_; - // Offset for baseline positions, in pixels. Each baseline is at - // line_spacing_ * n + line_offset_ for integer n, which represents - // [textline] line number in a line numbering system that has line 0 on or - // at least near the x-axis. Not equal to the actual line number of a line - // within a block as most blocks are not near the x-axis. - double line_offset_; - // The error of the line spacing model. - double model_error_; -}; - -class BaselineDetect { - public: - BaselineDetect(int debug_level, const FCOORD& page_skew, - TO_BLOCK_LIST* blocks); - - ~BaselineDetect(); - - // Finds the initial baselines for each TO_ROW in each TO_BLOCK, gathers - // block-wise and page-wise data to smooth small blocks/rows, and applies - // smoothing based on block/page-level skew and block-level linespacing. - void ComputeStraightBaselines(bool use_box_bottoms); - - // Computes the baseline splines for each TO_ROW in each TO_BLOCK and - // other associated side-effects, including pre-associating blobs, computing - // x-heights and displaying debug information. - // NOTE that ComputeStraightBaselines must have been called first as this - // sets up data in the TO_ROWs upon which this function depends. - void ComputeBaselineSplinesAndXheights(const ICOORD& page_tr, - bool enable_splines, - bool remove_noise, - bool show_final_rows, - Textord* textord); - - private: - // Average (median) skew of the blocks on the page among those that have - // a good angle of their own. - FCOORD page_skew_; - // Amount of debug output to produce. - int debug_level_; - // The blocks that we are working with. - PointerVector blocks_; -}; - -} // namespace tesseract - -#endif // TESSERACT_TEXTORD_BASELINEDETECT_H_ +/////////////////////////////////////////////////////////////////////// +// File: baselinedetect.h +// Description: Initial Baseline Determination. +// Copyright 2012 Google Inc. All Rights Reserved. +// Author: rays@google.com (Ray Smith) +// Created: Mon Apr 30 10:03:19 PDT 2012 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +#ifndef TESSERACT_TEXTORD_BASELINEDETECT_H_ +#define TESSERACT_TEXTORD_BASELINEDETECT_H_ + +#include "detlinefit.h" +#include "genericvector.h" +#include "points.h" +#include "rect.h" +#include "strngs.h" + +class BLOBNBOX_LIST; +class TO_BLOCK; +class TO_BLOCK_LIST; +class TO_ROW; +struct Pix; + +namespace tesseract { + +class Textord; + +// Class to compute and hold baseline data for a TO_ROW. +class BaselineRow { + public: + BaselineRow(double line_size, TO_ROW* to_row); + + const TBOX& bounding_box() const { + return bounding_box_; + } + // Sets the TO_ROW with the output straight line. + void SetupOldLineParameters(TO_ROW* row) const; + + // Outputs diagnostic information. + void Print() const; + + // Returns the skew angle (in radians) of the current baseline in [-pi,pi]. + double BaselineAngle() const; + // Computes and returns the linespacing at the middle of the overlap + // between this and other. + double SpaceBetween(const BaselineRow& other) const; + // Computes and returns the displacement of the center of the line + // perpendicular to the given direction. + double PerpDisp(const FCOORD& direction) const; + // Computes the y coordinate at the given x using the straight baseline + // defined by baseline1_ and baseline2_. + double StraightYAtX(double x) const; + + // Fits a straight baseline to the points. Returns true if it had enough + // points to be reasonably sure of the fitted baseline. + // If use_box_bottoms is false, baselines positions are formed by + // considering the outlines of the blobs. + bool FitBaseline(bool use_box_bottoms); + // Modifies an existing result of FitBaseline to be parallel to the given + // vector if that produces a better result. + void AdjustBaselineToParallel(int debug, const FCOORD& direction); + // Modifies the baseline to snap to the textline grid if the existing + // result is not good enough. + double AdjustBaselineToGrid(int debug, const FCOORD& direction, + double line_spacing, double line_offset); + + private: + // Sets up displacement_modes_ with the top few modes of the perpendicular + // distance of each blob from the given direction vector, after rounding. + void SetupBlobDisplacements(const FCOORD& direction); + + // Fits a line in the given direction to blobs that are close to the given + // target_offset perpendicular displacement from the direction. The fit + // error is allowed to be cheat_allowance worse than the existing fit, and + // will still be used. + // If cheat_allowance > 0, the new fit will be good and replace the current + // fit if it has better fit (with cheat) OR its error is below + // max_baseline_error_ and the old fit is marked bad. + // Otherwise the new fit will only replace the old if it is really better, + // or the old fit is marked bad and the new fit has sufficient points, as + // well as being within the max_baseline_error_. + void FitConstrainedIfBetter(int debug, const FCOORD& direction, + double cheat_allowance, + double target_offset); + // Returns the perpendicular distance of the point from the straight + // baseline. + double PerpDistanceFromBaseline(const FCOORD& pt) const; + // Computes the bounding box of the row. + void ComputeBoundingBox(); + + // The blobs of the row to which this BaselineRow adds extra information + // during baseline fitting. Note that blobs_ could easily come from either + // a TO_ROW or a ColPartition. + BLOBNBOX_LIST* blobs_; + // Bounding box of all the blobs. + TBOX bounding_box_; + // Fitter used to fit lines to the blobs. + DetLineFit fitter_; + // 2 points on the straight baseline. + FCOORD baseline_pt1_; + FCOORD baseline_pt2_; + // Set of modes of displacements. They indicate preferable baseline positions. + GenericVector displacement_modes_; + // Quantization factor used for displacement_modes_. + double disp_quant_factor_; + // Half the acceptance range of blob displacements for computing the + // error during a constrained fit. + double fit_halfrange_; + // Max baseline error before a line is regarded as fitting badly. + double max_baseline_error_; + // The error of fit of the baseline. + double baseline_error_; + // True if this row seems to have a good baseline. + bool good_baseline_; +}; + +// Class to compute and hold baseline data for a TO_BLOCK. +class BaselineBlock { + public: + BaselineBlock(int debug_level, bool non_text, TO_BLOCK* block); + + TO_BLOCK* block() const { + return block_; + } + double skew_angle() const { + return skew_angle_; + } + + // Computes and returns the absolute error of the given perp_disp from the + // given linespacing model. + static double SpacingModelError(double perp_disp, double line_spacing, + double line_offset); + + // Fits straight line baselines and computes the skew angle from the + // median angle. Returns true if a good angle is found. + // If use_box_bottoms is false, baseline positions are formed by + // considering the outlines of the blobs. + bool FitBaselinesAndFindSkew(bool use_box_bottoms); + + // Refits the baseline to a constrained angle, using the stored block + // skew if good enough, otherwise the supplied default skew. + void ParallelizeBaselines(double default_block_skew); + + // Sets the parameters in TO_BLOCK that are needed by subsequent processes. + void SetupBlockParameters() const; + + // Processing that is required before fitting baseline splines, but requires + // linear baselines in order to be successful: + // Removes noise if required + // Separates out underlines + // Pre-associates blob fragments. + // TODO(rays/joeliu) This entire section of code is inherited from the past + // and could be improved/eliminated. + // page_tr is used to size a debug window. + void PrepareForSplineFitting(ICOORD page_tr, bool remove_noise); + + // Fits splines to the textlines, or creates fake QSPLINES from the straight + // baselines that are already on the TO_ROWs. + // As a side-effect, computes the xheights of the rows and the block. + // Although x-height estimation is conceptually separate, it is part of + // detecting perspective distortion and therefore baseline fitting. + void FitBaselineSplines(bool enable_splines, bool show_final_rows, + Textord* textord); + + // Draws the (straight) baselines and final blobs colored according to + // what was discarded as noise and what is associated with each row. + void DrawFinalRows(const ICOORD& page_tr); + + // Render the generated spline baselines for this block on pix_in. + void DrawPixSpline(Pix* pix_in); + + private: + // Top-level line-spacing calculation. Computes an estimate of the line- + // spacing, using the current baselines in the TO_ROWS of the block, and + // then refines it by fitting a regression line to the baseline positions + // as a function of their integer index. + // Returns true if it seems that the model is a reasonable fit to the + // observations. + bool ComputeLineSpacing(); + + // Computes the deskewed vertical position of each baseline in the block and + // stores them in the given vector. + void ComputeBaselinePositions(const FCOORD& direction, + GenericVector* positions); + + // Computes an estimate of the line spacing of the block from the median + // of the spacings between adjacent overlapping textlines. + void EstimateLineSpacing(); + + // Refines the line spacing of the block by fitting a regression + // line to the deskewed y-position of each baseline as a function of its + // estimated line index, allowing for a small error in the initial linespacing + // and choosing the best available model. + void RefineLineSpacing(const GenericVector& positions); + + // Given an initial estimate of line spacing (m_in) and the positions of each + // baseline, computes the line spacing of the block more accurately in m_out, + // and the corresponding intercept in c_out, and the number of spacings seen + // in index_delta. Returns the error of fit to the line spacing model. + double FitLineSpacingModel(const GenericVector& positions, + double m_in, double* m_out, double* c_out, + int* index_delta); + + + // The block to which this class adds extra information used during baseline + // calculation. + TO_BLOCK* block_; + // The rows in the block that we will be working with. + PointerVector rows_; + // Amount of debugging output to provide. + int debug_level_; + // True if the block is non-text (graphic). + bool non_text_block_; + // True if the block has at least one good enough baseline to compute the + // skew angle and therefore skew_angle_ is valid. + bool good_skew_angle_; + // Angle of skew in radians using the conventional anticlockwise from x-axis. + double skew_angle_; + // Current best estimate line spacing in pixels perpendicular to skew_angle_. + double line_spacing_; + // Offset for baseline positions, in pixels. Each baseline is at + // line_spacing_ * n + line_offset_ for integer n, which represents + // [textline] line number in a line numbering system that has line 0 on or + // at least near the x-axis. Not equal to the actual line number of a line + // within a block as most blocks are not near the x-axis. + double line_offset_; + // The error of the line spacing model. + double model_error_; +}; + +class BaselineDetect { + public: + BaselineDetect(int debug_level, const FCOORD& page_skew, + TO_BLOCK_LIST* blocks); + + ~BaselineDetect(); + + // Finds the initial baselines for each TO_ROW in each TO_BLOCK, gathers + // block-wise and page-wise data to smooth small blocks/rows, and applies + // smoothing based on block/page-level skew and block-level linespacing. + void ComputeStraightBaselines(bool use_box_bottoms); + + // Computes the baseline splines for each TO_ROW in each TO_BLOCK and + // other associated side-effects, including pre-associating blobs, computing + // x-heights and displaying debug information. + // NOTE that ComputeStraightBaselines must have been called first as this + // sets up data in the TO_ROWs upon which this function depends. + void ComputeBaselineSplinesAndXheights(const ICOORD& page_tr, + bool enable_splines, + bool remove_noise, + bool show_final_rows, + Textord* textord); + + private: + // Average (median) skew of the blocks on the page among those that have + // a good angle of their own. + FCOORD page_skew_; + // Amount of debug output to produce. + int debug_level_; + // The blocks that we are working with. + PointerVector blocks_; +}; + +} // namespace tesseract + +#endif // TESSERACT_TEXTORD_BASELINEDETECT_H_ diff --git a/src/textord/blobgrid.cpp b/src/textord/blobgrid.cpp index ed52bd90c0..5448b00f78 100644 --- a/src/textord/blobgrid.cpp +++ b/src/textord/blobgrid.cpp @@ -1,44 +1,44 @@ -/////////////////////////////////////////////////////////////////////// -// File: blobgrid.cpp -// Description: BBGrid of BLOBNBOX with useful BLOBNBOX-specific methods. -// Copyright 2011 Google Inc. All Rights Reserved. -// Author: rays@google.com (Ray Smith) -// Created: Sat Jun 11 10:30:01 PST 2011 -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -#include "blobgrid.h" - -namespace tesseract { - -BlobGrid::BlobGrid(int gridsize, const ICOORD& bleft, const ICOORD& tright) - : BBGrid(gridsize, bleft, tright) { -} - -BlobGrid::~BlobGrid() { -} - -// Inserts all the blobs from the given list, with x and y spreading, -// without removing from the source list, so ownership remains with the -// source list. -void BlobGrid::InsertBlobList(BLOBNBOX_LIST* blobs) { - BLOBNBOX_IT blob_it(blobs); - for (blob_it.mark_cycle_pt(); !blob_it.cycled_list(); blob_it.forward()) { - BLOBNBOX* blob = blob_it.data(); - if (!blob->joined_to_prev()) - InsertBBox(true, true, blob); - } -} - - -} // namespace tesseract. +/////////////////////////////////////////////////////////////////////// +// File: blobgrid.cpp +// Description: BBGrid of BLOBNBOX with useful BLOBNBOX-specific methods. +// Copyright 2011 Google Inc. All Rights Reserved. +// Author: rays@google.com (Ray Smith) +// Created: Sat Jun 11 10:30:01 PST 2011 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +#include "blobgrid.h" + +namespace tesseract { + +BlobGrid::BlobGrid(int gridsize, const ICOORD& bleft, const ICOORD& tright) + : BBGrid(gridsize, bleft, tright) { +} + +BlobGrid::~BlobGrid() { +} + +// Inserts all the blobs from the given list, with x and y spreading, +// without removing from the source list, so ownership remains with the +// source list. +void BlobGrid::InsertBlobList(BLOBNBOX_LIST* blobs) { + BLOBNBOX_IT blob_it(blobs); + for (blob_it.mark_cycle_pt(); !blob_it.cycled_list(); blob_it.forward()) { + BLOBNBOX* blob = blob_it.data(); + if (!blob->joined_to_prev()) + InsertBBox(true, true, blob); + } +} + + +} // namespace tesseract. diff --git a/src/textord/blobgrid.h b/src/textord/blobgrid.h index 9b0b4d04a8..dc52be15de 100644 --- a/src/textord/blobgrid.h +++ b/src/textord/blobgrid.h @@ -1,46 +1,46 @@ -/////////////////////////////////////////////////////////////////////// -// File: blobgrid.h -// Description: BBGrid of BLOBNBOX with useful BLOBNBOX-specific methods. -// Copyright 2011 Google Inc. All Rights Reserved. -// Author: rays@google.com (Ray Smith) -// Created: Sat Jun 11 10:26:01 PST 2011 -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - - -#ifndef TESSERACT_TEXTORD_BLOBGRID_H_ -#define TESSERACT_TEXTORD_BLOBGRID_H_ - -#include "bbgrid.h" -#include "blobbox.h" - -CLISTIZEH(BLOBNBOX) - -namespace tesseract { - -typedef GridSearch BlobGridSearch; - -class BlobGrid : public BBGrid { - public: - BlobGrid(int gridsize, const ICOORD& bleft, const ICOORD& tright); - virtual ~BlobGrid(); - - // Inserts all the blobs from the given list, with x and y spreading, - // without removing from the source list, so ownership remains with the - // source list. - void InsertBlobList(BLOBNBOX_LIST* blobs); -}; - -} // namespace tesseract. - -#endif // TESSERACT_TEXTORD_BLOBGRID_H_ +/////////////////////////////////////////////////////////////////////// +// File: blobgrid.h +// Description: BBGrid of BLOBNBOX with useful BLOBNBOX-specific methods. +// Copyright 2011 Google Inc. All Rights Reserved. +// Author: rays@google.com (Ray Smith) +// Created: Sat Jun 11 10:26:01 PST 2011 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + + +#ifndef TESSERACT_TEXTORD_BLOBGRID_H_ +#define TESSERACT_TEXTORD_BLOBGRID_H_ + +#include "bbgrid.h" +#include "blobbox.h" + +CLISTIZEH(BLOBNBOX) + +namespace tesseract { + +typedef GridSearch BlobGridSearch; + +class BlobGrid : public BBGrid { + public: + BlobGrid(int gridsize, const ICOORD& bleft, const ICOORD& tright); + virtual ~BlobGrid(); + + // Inserts all the blobs from the given list, with x and y spreading, + // without removing from the source list, so ownership remains with the + // source list. + void InsertBlobList(BLOBNBOX_LIST* blobs); +}; + +} // namespace tesseract. + +#endif // TESSERACT_TEXTORD_BLOBGRID_H_ diff --git a/src/textord/cjkpitch.h b/src/textord/cjkpitch.h index 8ca82d767f..601ec21371 100644 --- a/src/textord/cjkpitch.h +++ b/src/textord/cjkpitch.h @@ -1,71 +1,71 @@ -/////////////////////////////////////////////////////////////////////// -// File: cjkpitch.h -// Description: Code to determine fixed pitchness and the pitch if fixed, -// for CJK text. -// Copyright 2011 Google Inc. All Rights Reserved. -// Author: takenaka@google.com (Hiroshi Takenaka) -// Created: Mon Jun 27 12:48:35 JST 2011 -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// -#ifndef CJKPITCH_H_ -#define CJKPITCH_H_ - -#include "blobbox.h" - -// Function to test "fixed-pitchness" of the input text and estimating -// character pitch parameters for it, based on CJK fixed-pitch layout -// model. -// -// This function assumes that a fixed-pitch CJK text has following -// characteristics: -// -// - Most glyphs are designed to fit within the same sized square -// (imaginary body). Also they are aligned to the center of their -// imaginary bodies. -// - The imaginary body is always a regular rectangle. -// - There may be some extra space between character bodies -// (tracking). -// - There may be some extra space after punctuations. -// - The text is *not* space-delimited. Thus spaces are rare. -// - Character may consists of multiple unconnected blobs. -// -// And the function works in two passes. On pass 1, it looks for such -// "good" blobs that has the pitch same pitch on the both side and -// looks like a complete CJK character. Then estimates the character -// pitch for every row, based on those good blobs. If we couldn't find -// enough good blobs for a row, then the pitch is estimated from other -// rows with similar character height instead. -// -// Pass 2 is an iterative process to fit the blobs into fixed-pitch -// character cells. Once we have estimated the character pitch, blobs -// that are almost as large as the pitch can be considered to be -// complete characters. And once we know that some characters are -// complete characters, we can estimate the region occupied by its -// neighbors. And so on. -// -// We repeat the process until all ambiguities are resolved. Then make -// the final decision about fixed-pitchness of each row and compute -// pitch and spacing parameters. -// -// (If a row is considered to be propotional, pitch_decision for the -// row is set to PITCH_CORR_PROP and the later phase -// (i.e. Textord::to_spacing()) should determine its spacing -// parameters) -// -// This function doesn't provide all information required by -// fixed_pitch_words() and the rows need to be processed with -// make_prop_words() even if they are fixed pitched. -void compute_fixed_pitch_cjk(ICOORD page_tr, // top right - TO_BLOCK_LIST *port_blocks); // input list - -#endif // CJKPITCH_H_ +/////////////////////////////////////////////////////////////////////// +// File: cjkpitch.h +// Description: Code to determine fixed pitchness and the pitch if fixed, +// for CJK text. +// Copyright 2011 Google Inc. All Rights Reserved. +// Author: takenaka@google.com (Hiroshi Takenaka) +// Created: Mon Jun 27 12:48:35 JST 2011 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// +#ifndef CJKPITCH_H_ +#define CJKPITCH_H_ + +#include "blobbox.h" + +// Function to test "fixed-pitchness" of the input text and estimating +// character pitch parameters for it, based on CJK fixed-pitch layout +// model. +// +// This function assumes that a fixed-pitch CJK text has following +// characteristics: +// +// - Most glyphs are designed to fit within the same sized square +// (imaginary body). Also they are aligned to the center of their +// imaginary bodies. +// - The imaginary body is always a regular rectangle. +// - There may be some extra space between character bodies +// (tracking). +// - There may be some extra space after punctuations. +// - The text is *not* space-delimited. Thus spaces are rare. +// - Character may consists of multiple unconnected blobs. +// +// And the function works in two passes. On pass 1, it looks for such +// "good" blobs that has the pitch same pitch on the both side and +// looks like a complete CJK character. Then estimates the character +// pitch for every row, based on those good blobs. If we couldn't find +// enough good blobs for a row, then the pitch is estimated from other +// rows with similar character height instead. +// +// Pass 2 is an iterative process to fit the blobs into fixed-pitch +// character cells. Once we have estimated the character pitch, blobs +// that are almost as large as the pitch can be considered to be +// complete characters. And once we know that some characters are +// complete characters, we can estimate the region occupied by its +// neighbors. And so on. +// +// We repeat the process until all ambiguities are resolved. Then make +// the final decision about fixed-pitchness of each row and compute +// pitch and spacing parameters. +// +// (If a row is considered to be propotional, pitch_decision for the +// row is set to PITCH_CORR_PROP and the later phase +// (i.e. Textord::to_spacing()) should determine its spacing +// parameters) +// +// This function doesn't provide all information required by +// fixed_pitch_words() and the rows need to be processed with +// make_prop_words() even if they are fixed pitched. +void compute_fixed_pitch_cjk(ICOORD page_tr, // top right + TO_BLOCK_LIST *port_blocks); // input list + +#endif // CJKPITCH_H_ diff --git a/src/textord/drawedg.cpp b/src/textord/drawedg.cpp index 4992c28f47..0a429b5483 100644 --- a/src/textord/drawedg.cpp +++ b/src/textord/drawedg.cpp @@ -1,83 +1,83 @@ -/********************************************************************** - * File: drawedg.cpp (Formerly drawedge.c) - * Description: Collection of functions to draw things to do with edge - * detection. - * Author: Ray Smith - * Created: Thu Jun 06 13:29:20 BST 1991 - * - * (C) Copyright 1991, Hewlett-Packard Ltd. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -#include "drawedg.h" - -// Include automatically generated configuration file if running autoconf. -#ifdef HAVE_CONFIG_H -#include "config_auto.h" -#endif - -#ifndef GRAPHICS_DISABLED - -/** title of window */ -#define IMAGE_WIN_NAME "Edges" -#define IMAGE_XPOS 250 -/** default position */ -#define IMAGE_YPOS 0 - -#define EXTERN - -/** - * @name create_edges_window - * - * Create the edges window. - * @param page_tr size of image - */ - -ScrollView* create_edges_window(ICOORD page_tr) { - ScrollView* image_win; //image window - - //create the window - image_win = new ScrollView (IMAGE_WIN_NAME, IMAGE_XPOS, IMAGE_YPOS, 0, 0, page_tr.x (), page_tr.y ()); - return image_win; //window -} - - -/** - * @name draw_raw_edge - * - * Draw the raw steps to the given window in the given colour. - * @param fd window to draw in - * @param start start of loop - * @param colour colour to draw in - */ - -void draw_raw_edge(ScrollView* fd, - CRACKEDGE *start, - ScrollView::Color colour) { - CRACKEDGE *edgept; //current point - - fd->Pen(colour); - edgept = start; - fd->SetCursor(edgept->pos.x (), edgept->pos.y ()); - do { - do - edgept = edgept->next; - //merge straight lines - while (edgept != start && edgept->prev->stepx == edgept->stepx && edgept->prev->stepy == edgept->stepy); - - //draw lines - fd->DrawTo(edgept->pos.x (), edgept->pos.y ()); - } - while (edgept != start); -} - -#endif // GRAPHICS_DISABLED +/********************************************************************** + * File: drawedg.cpp (Formerly drawedge.c) + * Description: Collection of functions to draw things to do with edge + * detection. + * Author: Ray Smith + * Created: Thu Jun 06 13:29:20 BST 1991 + * + * (C) Copyright 1991, Hewlett-Packard Ltd. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +#include "drawedg.h" + +// Include automatically generated configuration file if running autoconf. +#ifdef HAVE_CONFIG_H +#include "config_auto.h" +#endif + +#ifndef GRAPHICS_DISABLED + +/** title of window */ +#define IMAGE_WIN_NAME "Edges" +#define IMAGE_XPOS 250 +/** default position */ +#define IMAGE_YPOS 0 + +#define EXTERN + +/** + * @name create_edges_window + * + * Create the edges window. + * @param page_tr size of image + */ + +ScrollView* create_edges_window(ICOORD page_tr) { + ScrollView* image_win; //image window + + //create the window + image_win = new ScrollView (IMAGE_WIN_NAME, IMAGE_XPOS, IMAGE_YPOS, 0, 0, page_tr.x (), page_tr.y ()); + return image_win; //window +} + + +/** + * @name draw_raw_edge + * + * Draw the raw steps to the given window in the given colour. + * @param fd window to draw in + * @param start start of loop + * @param colour colour to draw in + */ + +void draw_raw_edge(ScrollView* fd, + CRACKEDGE *start, + ScrollView::Color colour) { + CRACKEDGE *edgept; //current point + + fd->Pen(colour); + edgept = start; + fd->SetCursor(edgept->pos.x (), edgept->pos.y ()); + do { + do + edgept = edgept->next; + //merge straight lines + while (edgept != start && edgept->prev->stepx == edgept->stepx && edgept->prev->stepy == edgept->stepy); + + //draw lines + fd->DrawTo(edgept->pos.x (), edgept->pos.y ()); + } + while (edgept != start); +} + +#endif // GRAPHICS_DISABLED diff --git a/src/textord/drawedg.h b/src/textord/drawedg.h index 6a30230ede..ef5ed5e202 100644 --- a/src/textord/drawedg.h +++ b/src/textord/drawedg.h @@ -1,37 +1,37 @@ -/********************************************************************** - * File: drawedg.h (Formerly drawedge.h) - * Description: Collection of functions to draw things to do with edge - *detection. - * Author: Ray Smith - * Created: Thu Jun 06 13:29:20 BST 1991 - * - * (C) Copyright 1991, Hewlett-Packard Ltd. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -#ifndef DRAWEDG_H -#define DRAWEDG_H -#ifndef GRAPHICS_DISABLED - -#include "scrollview.h" -#include "crakedge.h" - -ScrollView* create_edges_window( //make window - ICOORD page_tr //size of image - ); -void draw_raw_edge( //draw the cracks - ScrollView* fd, //window to draw in - CRACKEDGE *start, //start of loop - ScrollView::Color colour //colour to draw in - ); -#endif -#endif +/********************************************************************** + * File: drawedg.h (Formerly drawedge.h) + * Description: Collection of functions to draw things to do with edge + *detection. + * Author: Ray Smith + * Created: Thu Jun 06 13:29:20 BST 1991 + * + * (C) Copyright 1991, Hewlett-Packard Ltd. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +#ifndef DRAWEDG_H +#define DRAWEDG_H +#ifndef GRAPHICS_DISABLED + +#include "scrollview.h" +#include "crakedge.h" + +ScrollView* create_edges_window( //make window + ICOORD page_tr //size of image + ); +void draw_raw_edge( //draw the cracks + ScrollView* fd, //window to draw in + CRACKEDGE *start, //start of loop + ScrollView::Color colour //colour to draw in + ); +#endif +#endif diff --git a/src/textord/equationdetectbase.h b/src/textord/equationdetectbase.h index d48dfea159..e9bacd2a89 100644 --- a/src/textord/equationdetectbase.h +++ b/src/textord/equationdetectbase.h @@ -1,59 +1,59 @@ -/////////////////////////////////////////////////////////////////////// -// File: equationdetectbase.h -// Description: The base class equation detection class. -// Author: Zongyi (Joe) Liu (joeliu@google.com) -// Created: Fri Aug 31 11:13:01 PST 2011 -// -// (C) Copyright 2011, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -#ifndef TESSERACT_TEXTORD_EQUATIONDETECTBASE_H_ -#define TESSERACT_TEXTORD_EQUATIONDETECTBASE_H_ - -class BLOBNBOX_LIST; -class TO_BLOCK; -struct Pix; - -namespace tesseract { - -class ColPartitionGrid; -class ColPartitionSet; - -class EquationDetectBase { - public: - EquationDetectBase(); - virtual ~EquationDetectBase(); - - // Iterate over the blobs inside to_block, and set the blobs that we want to - // process to BSTT_NONE. (By default, they should be BSTT_SKIP). The function - // returns 0 upon success. - virtual int LabelSpecialText(TO_BLOCK* to_block) = 0; - - // Interface to find possible equation partition grid from part_grid. This - // should be called after IdentifySpecialText function. - virtual int FindEquationParts(ColPartitionGrid* part_grid, - ColPartitionSet** best_columns) = 0; - - // Debug function: Render a bounding box on pix based on the value of its - // special_text_type, specifically: - // BSTT_MATH: red box - // BSTT_DIGIT: cyan box - // BSTT_ITALIC: green box - // BSTT_UNCLEAR: blue box - // All others: yellow box - static void RenderSpecialText(Pix* pix, BLOBNBOX* blob); -}; - -} // namespace tesseract - -#endif // TESSERACT_TEXTORD_EQUATIONDETECTBASE_H_ +/////////////////////////////////////////////////////////////////////// +// File: equationdetectbase.h +// Description: The base class equation detection class. +// Author: Zongyi (Joe) Liu (joeliu@google.com) +// Created: Fri Aug 31 11:13:01 PST 2011 +// +// (C) Copyright 2011, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +#ifndef TESSERACT_TEXTORD_EQUATIONDETECTBASE_H_ +#define TESSERACT_TEXTORD_EQUATIONDETECTBASE_H_ + +class BLOBNBOX_LIST; +class TO_BLOCK; +struct Pix; + +namespace tesseract { + +class ColPartitionGrid; +class ColPartitionSet; + +class EquationDetectBase { + public: + EquationDetectBase(); + virtual ~EquationDetectBase(); + + // Iterate over the blobs inside to_block, and set the blobs that we want to + // process to BSTT_NONE. (By default, they should be BSTT_SKIP). The function + // returns 0 upon success. + virtual int LabelSpecialText(TO_BLOCK* to_block) = 0; + + // Interface to find possible equation partition grid from part_grid. This + // should be called after IdentifySpecialText function. + virtual int FindEquationParts(ColPartitionGrid* part_grid, + ColPartitionSet** best_columns) = 0; + + // Debug function: Render a bounding box on pix based on the value of its + // special_text_type, specifically: + // BSTT_MATH: red box + // BSTT_DIGIT: cyan box + // BSTT_ITALIC: green box + // BSTT_UNCLEAR: blue box + // All others: yellow box + static void RenderSpecialText(Pix* pix, BLOBNBOX* blob); +}; + +} // namespace tesseract + +#endif // TESSERACT_TEXTORD_EQUATIONDETECTBASE_H_ diff --git a/src/textord/strokewidth.h b/src/textord/strokewidth.h index 512ce66acb..497ffaebab 100644 --- a/src/textord/strokewidth.h +++ b/src/textord/strokewidth.h @@ -1,355 +1,355 @@ -/////////////////////////////////////////////////////////////////////// -// File: strokewidth.h -// Description: Subclass of BBGrid to find uniformity of strokewidth. -// Author: Ray Smith -// Created: Mon Mar 31 16:17:01 PST 2008 -// -// (C) Copyright 2008, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -#ifndef TESSERACT_TEXTORD_STROKEWIDTH_H_ -#define TESSERACT_TEXTORD_STROKEWIDTH_H_ - -#include "blobbox.h" // BlobNeighourDir. -#include "blobgrid.h" // Base class. -#include "colpartitiongrid.h" -#include "textlineprojection.h" - -class DENORM; -class ScrollView; -class TO_BLOCK; - -namespace tesseract { - -class ColPartition_LIST; -class TabFind; -class TextlineProjection; - -// Misc enums to clarify bool arguments for direction-controlling args. -enum LeftOrRight { - LR_LEFT, - LR_RIGHT -}; - -// Return value from FindInitialPartitions indicates detection of severe -// skew or noise. -enum PartitionFindResult { - PFR_OK, // Everything is OK. - PFR_SKEW, // Skew was detected and rotated. - PFR_NOISE // Noise was detected and removed. -}; - -/** - * The StrokeWidth class holds all the normal and large blobs. - * It is used to find good large blobs and move them to the normal blobs - * by virtue of having a reasonable strokewidth compatible neighbour. - */ -class StrokeWidth : public BlobGrid { - public: - StrokeWidth(int gridsize, const ICOORD& bleft, const ICOORD& tright); - virtual ~StrokeWidth(); - - // Sets the neighbours member of the medium-sized blobs in the block. - // Searches on 4 sides of each blob for similar-sized, similar-strokewidth - // blobs and sets pointers to the good neighbours. - void SetNeighboursOnMediumBlobs(TO_BLOCK* block); - - // Sets the neighbour/textline writing direction members of the medium - // and large blobs with optional repair of broken CJK characters first. - // Repair of broken CJK is needed here because broken CJK characters - // can fool the textline direction detection algorithm. - void FindTextlineDirectionAndFixBrokenCJK(PageSegMode pageseg_mode, - bool cjk_merge, - TO_BLOCK* input_block); - - // To save computation, the process of generating partitions is broken - // into the following 4 steps: - // TestVerticalTextDirection - // CorrectForRotation (used only if a rotation is to be applied) - // FindLeaderPartitions - // GradeBlobsIntoPartitions. - // These functions are all required, in sequence, except for - // CorrectForRotation, which is not needed if no rotation is applied. - - // Types all the blobs as vertical or horizontal text or unknown and - // returns true if the majority are vertical. - // If the blobs are rotated, it is necessary to call CorrectForRotation - // after rotating everything, otherwise the work done here will be enough. - // If osd_blobs is not null, a list of blobs from the dominant textline - // direction are returned for use in orientation and script detection. - // find_vertical_text_ratio should be textord_tabfind_vertical_text_ratio. - bool TestVerticalTextDirection(double find_vertical_text_ratio, - TO_BLOCK* block, - BLOBNBOX_CLIST* osd_blobs); - - // Corrects the data structures for the given rotation. - void CorrectForRotation(const FCOORD& rerotation, - ColPartitionGrid* part_grid); - - // Finds leader partitions and inserts them into the give grid. - void FindLeaderPartitions(TO_BLOCK* block, - ColPartitionGrid* part_grid); - - // Finds and marks noise those blobs that look like bits of vertical lines - // that would otherwise screw up layout analysis. - void RemoveLineResidue(ColPartition_LIST* big_part_list); - - // Types all the blobs as vertical text or horizontal text or unknown and - // puts them into initial ColPartitions in the supplied part_grid. - // rerotation determines how to get back to the image coordinates from the - // blob coordinates (since they may have been rotated for vertical text). - // block is the single block for the whole page or rectangle to be OCRed. - // nontext_pix (full-size), is a binary mask used to prevent merges across - // photo/text boundaries. It is not kept beyond this function. - // denorm provides a mapping back to the image from the current blob - // coordinate space. - // projection provides a measure of textline density over the image and - // provides functions to assist with diacritic detection. It should be a - // pointer to a new TextlineProjection, and will be setup here. - // part_grid is the output grid of textline partitions. - // Large blobs that cause overlap are put in separate partitions and added - // to the big_parts list. - void GradeBlobsIntoPartitions(PageSegMode pageseg_mode, - const FCOORD& rerotation, TO_BLOCK* block, - Pix* nontext_pix, const DENORM* denorm, - bool cjk_script, TextlineProjection* projection, - BLOBNBOX_LIST* diacritic_blobs, - ColPartitionGrid* part_grid, - ColPartition_LIST* big_parts); - - // Handles a click event in a display window. - virtual void HandleClick(int x, int y); - - private: - // Computes the noise_density_ by summing the number of elements in a - // neighbourhood of each grid cell. - void ComputeNoiseDensity(TO_BLOCK* block, TabFind* line_grid); - - // Detects and marks leader dots/dashes. - // Leaders are horizontal chains of small or noise blobs that look - // monospace according to ColPartition::MarkAsLeaderIfMonospaced(). - // Detected leaders become the only occupants of the block->small_blobs list. - // Non-leader small blobs get moved to the blobs list. - // Non-leader noise blobs remain singletons in the noise list. - // All small and noise blobs in high density regions are marked BTFT_NONTEXT. - // block is the single block for the whole page or rectangle to be OCRed. - // leader_parts is the output. - void FindLeadersAndMarkNoise(TO_BLOCK* block, - ColPartition_LIST* leader_parts); - - /** Inserts the block blobs (normal and large) into this grid. - * Blobs remain owned by the block. */ - void InsertBlobs(TO_BLOCK* block); - - // Fix broken CJK characters, using the fake joined blobs mechanism. - // Blobs are really merged, ie the master takes all the outlines and the - // others are deleted. - // Returns true if sufficient blobs are merged that it may be worth running - // again, due to a better estimate of character size. - bool FixBrokenCJK(TO_BLOCK* block); - - // Collect blobs that overlap or are within max_dist of the input bbox. - // Return them in the list of blobs and expand the bbox to be the union - // of all the boxes. not_this is excluded from the search, as are blobs - // that cause the merged box to exceed max_size in either dimension. - void AccumulateOverlaps(const BLOBNBOX* not_this, bool debug, - int max_size, int max_dist, - TBOX* bbox, BLOBNBOX_CLIST* blobs); - - // For each blob in this grid, Finds the textline direction to be horizontal - // or vertical according to distance to neighbours and 1st and 2nd order - // neighbours. Non-text tends to end up without a definite direction. - // Result is setting of the neighbours and vert_possible/horz_possible - // flags in the BLOBNBOXes currently in this grid. - // This function is called more than once if page orientation is uncertain, - // so display_if_debugging is true on the final call to display the results. - void FindTextlineFlowDirection(PageSegMode pageseg_mode, - bool display_if_debugging); - - // Sets the neighbours and good_stroke_neighbours members of the blob by - // searching close on all 4 sides. - // When finding leader dots/dashes, there is a slightly different rule for - // what makes a good neighbour. - // If activate_line_trap, then line-like objects are found and isolated. - void SetNeighbours(bool leaders, bool activate_line_trap, BLOBNBOX* blob); - - // Sets the good_stroke_neighbours member of the blob if it has a - // GoodNeighbour on the given side. - // Also sets the neighbour in the blob, whether or not a good one is found. - // Return value is the number of neighbours in the line trap size range. - // Leaders get extra special lenient treatment. - int FindGoodNeighbour(BlobNeighbourDir dir, bool leaders, BLOBNBOX* blob); - - // Makes the blob to be only horizontal or vertical where evidence - // is clear based on gaps of 2nd order neighbours. - void SetNeighbourFlows(BLOBNBOX* blob); - - // Nullify the neighbours in the wrong directions where the direction - // is clear-cut based on a distance margin. Good for isolating vertical - // text from neighbouring horizontal text. - void SimplifyObviousNeighbours(BLOBNBOX* blob); - - // Smoothes the vertical/horizontal type of the blob based on the - // 2nd-order neighbours. If reset_all is true, then all blobs are - // changed. Otherwise, only ambiguous blobs are processed. - void SmoothNeighbourTypes(PageSegMode pageseg_mode, bool desperate, - BLOBNBOX* blob); - - // Checks the left or right side of the given leader partition and sets the - // (opposite) leader_on_right or leader_on_left flags for blobs - // that are next to the given side of the given leader partition. - void MarkLeaderNeighbours(const ColPartition* part, LeftOrRight side); - - // Partition creation. Accumulates vertical and horizontal text chains, - // puts the remaining blobs in as unknowns, and then merges/splits to - // minimize overlap and smoothes the types with neighbours and the color - // image if provided. rerotation is used to rotate the coordinate space - // back to the nontext_map_ image. - // If find_problems is true, detects possible noise pollution by the amount - // of partition overlap that is created by the diacritics. If excessive, the - // noise is separated out into diacritic blobs, and PFR_NOISE is returned. - // [TODO(rays): if the partition overlap is caused by heavy skew, deskews - // the components, saves the skew_angle and returns PFR_SKEW.] If the return - // is not PFR_OK, the job is incomplete, and FindInitialPartitions must be - // called again after cleaning up the partly done work. - PartitionFindResult FindInitialPartitions(PageSegMode pageseg_mode, - const FCOORD& rerotation, - bool find_problems, TO_BLOCK* block, - BLOBNBOX_LIST* diacritic_blobs, - ColPartitionGrid* part_grid, - ColPartition_LIST* big_parts, - FCOORD* skew_angle); - // Detects noise by a significant increase in partition overlap from - // pre_overlap to now, and removes noise from the union of all the overlapping - // partitions, placing the blobs in diacritic_blobs. Returns true if any noise - // was found and removed. - bool DetectAndRemoveNoise(int pre_overlap, const TBOX& grid_box, - TO_BLOCK* block, ColPartitionGrid* part_grid, - BLOBNBOX_LIST* diacritic_blobs); - // Finds vertical chains of text-like blobs and puts them in ColPartitions. - void FindVerticalTextChains(ColPartitionGrid* part_grid); - // Finds horizontal chains of text-like blobs and puts them in ColPartitions. - void FindHorizontalTextChains(ColPartitionGrid* part_grid); - // Finds diacritics and saves their base character in the blob. - void TestDiacritics(ColPartitionGrid* part_grid, TO_BLOCK* block); - // Searches this grid for an appropriately close and sized neighbour of the - // given [small] blob. If such a blob is found, the diacritic base is saved - // in the blob and true is returned. - // The small_grid is a secondary grid that contains the small/noise objects - // that are not in this grid, but may be useful for determining a connection - // between blob and its potential base character. (See DiacriticXGapFilled.) - bool DiacriticBlob(BlobGrid* small_grid, BLOBNBOX* blob); - // Returns true if there is no gap between the base char and the diacritic - // bigger than a fraction of the height of the base char: - // Eg: line end.....' - // The quote is a long way from the end of the line, yet it needs to be a - // diacritic. To determine that the quote is not part of an image, or - // a different text block, we check for other marks in the gap between - // the base char and the diacritic. - // '<--Diacritic - // |---------| - // | |<-toobig-gap-> - // | Base | - // |---------| x<-----Dot occupying gap - // The grid is const really. - bool DiacriticXGapFilled(BlobGrid* grid, const TBOX& diacritic_box, - const TBOX& base_box); - // Merges diacritics with the ColPartition of the base character blob. - void MergeDiacritics(TO_BLOCK* block, ColPartitionGrid* part_grid); - // Any blobs on the large_blobs list of block that are still unowned by a - // ColPartition, are probably drop-cap or vertically touching so the blobs - // are removed to the big_parts list and treated separately. - void RemoveLargeUnusedBlobs(TO_BLOCK* block, - ColPartitionGrid* part_grid, - ColPartition_LIST* big_parts); - - // All remaining unused blobs are put in individual ColPartitions. - void PartitionRemainingBlobs(PageSegMode pageseg_mode, - ColPartitionGrid* part_grid); - - // If combine, put all blobs in the cell_list into a single partition, - // otherwise put each one into its own partition. - void MakePartitionsFromCellList(PageSegMode pageseg_mode, bool combine, - ColPartitionGrid* part_grid, - BLOBNBOX_CLIST* cell_list); - - // Helper function to finish setting up a ColPartition and insert into - // part_grid. - void CompletePartition(PageSegMode pageseg_mode, ColPartition* part, - ColPartitionGrid* part_grid); - - // Helper returns true if we are looking only for vertical textlines, - // taking into account any rotation that has been done. - bool FindingVerticalOnly(PageSegMode pageseg_mode) const { - if (rerotation_.y() == 0.0f) { - return pageseg_mode == PSM_SINGLE_BLOCK_VERT_TEXT; - } - return !PSM_ORIENTATION_ENABLED(pageseg_mode) && - pageseg_mode != PSM_SINGLE_BLOCK_VERT_TEXT; - } - // Helper returns true if we are looking only for horizontal textlines, - // taking into account any rotation that has been done. - bool FindingHorizontalOnly(PageSegMode pageseg_mode) const { - if (rerotation_.y() == 0.0f) { - return !PSM_ORIENTATION_ENABLED(pageseg_mode) && - pageseg_mode != PSM_SINGLE_BLOCK_VERT_TEXT; - } - return pageseg_mode == PSM_SINGLE_BLOCK_VERT_TEXT; - } - - // Merge partitions where the merge appears harmless. - void EasyMerges(ColPartitionGrid* part_grid); - - // Compute a search box based on the orientation of the partition. - // Returns true if a suitable box can be calculated. - // Callback for EasyMerges. - bool OrientationSearchBox(ColPartition* part, TBOX* box); - - // Merge confirmation callback for EasyMerges. - bool ConfirmEasyMerge(const ColPartition* p1, const ColPartition* p2); - - // Returns true if there is no significant noise in between the boxes. - bool NoNoiseInBetween(const TBOX& box1, const TBOX& box2) const; - - // Displays the blobs colored according to the number of good neighbours - // and the vertical/horizontal flow. - ScrollView* DisplayGoodBlobs(const char* window_name, int x, int y); - - // Displays blobs colored according to whether or not they are diacritics. - ScrollView* DisplayDiacritics(const char* window_name, - int x, int y, TO_BLOCK* block); - - private: - // Image map of photo/noise areas on the page. Borrowed pointer (not owned.) - Pix* nontext_map_; - // Textline projection map. Borrowed pointer. - TextlineProjection* projection_; - // DENORM used by projection_ to get back to image coords. Borrowed pointer. - const DENORM* denorm_; - // Bounding box of the grid. - TBOX grid_box_; - // Rerotation to get back to the original image. - FCOORD rerotation_; - // Windows for debug display. - ScrollView* leaders_win_; - ScrollView* initial_widths_win_; - ScrollView* widths_win_; - ScrollView* chains_win_; - ScrollView* diacritics_win_; - ScrollView* textlines_win_; - ScrollView* smoothed_win_; -}; - -} // namespace tesseract. - -#endif // TESSERACT_TEXTORD_STROKEWIDTH_H_ +/////////////////////////////////////////////////////////////////////// +// File: strokewidth.h +// Description: Subclass of BBGrid to find uniformity of strokewidth. +// Author: Ray Smith +// Created: Mon Mar 31 16:17:01 PST 2008 +// +// (C) Copyright 2008, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +#ifndef TESSERACT_TEXTORD_STROKEWIDTH_H_ +#define TESSERACT_TEXTORD_STROKEWIDTH_H_ + +#include "blobbox.h" // BlobNeighourDir. +#include "blobgrid.h" // Base class. +#include "colpartitiongrid.h" +#include "textlineprojection.h" + +class DENORM; +class ScrollView; +class TO_BLOCK; + +namespace tesseract { + +class ColPartition_LIST; +class TabFind; +class TextlineProjection; + +// Misc enums to clarify bool arguments for direction-controlling args. +enum LeftOrRight { + LR_LEFT, + LR_RIGHT +}; + +// Return value from FindInitialPartitions indicates detection of severe +// skew or noise. +enum PartitionFindResult { + PFR_OK, // Everything is OK. + PFR_SKEW, // Skew was detected and rotated. + PFR_NOISE // Noise was detected and removed. +}; + +/** + * The StrokeWidth class holds all the normal and large blobs. + * It is used to find good large blobs and move them to the normal blobs + * by virtue of having a reasonable strokewidth compatible neighbour. + */ +class StrokeWidth : public BlobGrid { + public: + StrokeWidth(int gridsize, const ICOORD& bleft, const ICOORD& tright); + virtual ~StrokeWidth(); + + // Sets the neighbours member of the medium-sized blobs in the block. + // Searches on 4 sides of each blob for similar-sized, similar-strokewidth + // blobs and sets pointers to the good neighbours. + void SetNeighboursOnMediumBlobs(TO_BLOCK* block); + + // Sets the neighbour/textline writing direction members of the medium + // and large blobs with optional repair of broken CJK characters first. + // Repair of broken CJK is needed here because broken CJK characters + // can fool the textline direction detection algorithm. + void FindTextlineDirectionAndFixBrokenCJK(PageSegMode pageseg_mode, + bool cjk_merge, + TO_BLOCK* input_block); + + // To save computation, the process of generating partitions is broken + // into the following 4 steps: + // TestVerticalTextDirection + // CorrectForRotation (used only if a rotation is to be applied) + // FindLeaderPartitions + // GradeBlobsIntoPartitions. + // These functions are all required, in sequence, except for + // CorrectForRotation, which is not needed if no rotation is applied. + + // Types all the blobs as vertical or horizontal text or unknown and + // returns true if the majority are vertical. + // If the blobs are rotated, it is necessary to call CorrectForRotation + // after rotating everything, otherwise the work done here will be enough. + // If osd_blobs is not null, a list of blobs from the dominant textline + // direction are returned for use in orientation and script detection. + // find_vertical_text_ratio should be textord_tabfind_vertical_text_ratio. + bool TestVerticalTextDirection(double find_vertical_text_ratio, + TO_BLOCK* block, + BLOBNBOX_CLIST* osd_blobs); + + // Corrects the data structures for the given rotation. + void CorrectForRotation(const FCOORD& rerotation, + ColPartitionGrid* part_grid); + + // Finds leader partitions and inserts them into the give grid. + void FindLeaderPartitions(TO_BLOCK* block, + ColPartitionGrid* part_grid); + + // Finds and marks noise those blobs that look like bits of vertical lines + // that would otherwise screw up layout analysis. + void RemoveLineResidue(ColPartition_LIST* big_part_list); + + // Types all the blobs as vertical text or horizontal text or unknown and + // puts them into initial ColPartitions in the supplied part_grid. + // rerotation determines how to get back to the image coordinates from the + // blob coordinates (since they may have been rotated for vertical text). + // block is the single block for the whole page or rectangle to be OCRed. + // nontext_pix (full-size), is a binary mask used to prevent merges across + // photo/text boundaries. It is not kept beyond this function. + // denorm provides a mapping back to the image from the current blob + // coordinate space. + // projection provides a measure of textline density over the image and + // provides functions to assist with diacritic detection. It should be a + // pointer to a new TextlineProjection, and will be setup here. + // part_grid is the output grid of textline partitions. + // Large blobs that cause overlap are put in separate partitions and added + // to the big_parts list. + void GradeBlobsIntoPartitions(PageSegMode pageseg_mode, + const FCOORD& rerotation, TO_BLOCK* block, + Pix* nontext_pix, const DENORM* denorm, + bool cjk_script, TextlineProjection* projection, + BLOBNBOX_LIST* diacritic_blobs, + ColPartitionGrid* part_grid, + ColPartition_LIST* big_parts); + + // Handles a click event in a display window. + virtual void HandleClick(int x, int y); + + private: + // Computes the noise_density_ by summing the number of elements in a + // neighbourhood of each grid cell. + void ComputeNoiseDensity(TO_BLOCK* block, TabFind* line_grid); + + // Detects and marks leader dots/dashes. + // Leaders are horizontal chains of small or noise blobs that look + // monospace according to ColPartition::MarkAsLeaderIfMonospaced(). + // Detected leaders become the only occupants of the block->small_blobs list. + // Non-leader small blobs get moved to the blobs list. + // Non-leader noise blobs remain singletons in the noise list. + // All small and noise blobs in high density regions are marked BTFT_NONTEXT. + // block is the single block for the whole page or rectangle to be OCRed. + // leader_parts is the output. + void FindLeadersAndMarkNoise(TO_BLOCK* block, + ColPartition_LIST* leader_parts); + + /** Inserts the block blobs (normal and large) into this grid. + * Blobs remain owned by the block. */ + void InsertBlobs(TO_BLOCK* block); + + // Fix broken CJK characters, using the fake joined blobs mechanism. + // Blobs are really merged, ie the master takes all the outlines and the + // others are deleted. + // Returns true if sufficient blobs are merged that it may be worth running + // again, due to a better estimate of character size. + bool FixBrokenCJK(TO_BLOCK* block); + + // Collect blobs that overlap or are within max_dist of the input bbox. + // Return them in the list of blobs and expand the bbox to be the union + // of all the boxes. not_this is excluded from the search, as are blobs + // that cause the merged box to exceed max_size in either dimension. + void AccumulateOverlaps(const BLOBNBOX* not_this, bool debug, + int max_size, int max_dist, + TBOX* bbox, BLOBNBOX_CLIST* blobs); + + // For each blob in this grid, Finds the textline direction to be horizontal + // or vertical according to distance to neighbours and 1st and 2nd order + // neighbours. Non-text tends to end up without a definite direction. + // Result is setting of the neighbours and vert_possible/horz_possible + // flags in the BLOBNBOXes currently in this grid. + // This function is called more than once if page orientation is uncertain, + // so display_if_debugging is true on the final call to display the results. + void FindTextlineFlowDirection(PageSegMode pageseg_mode, + bool display_if_debugging); + + // Sets the neighbours and good_stroke_neighbours members of the blob by + // searching close on all 4 sides. + // When finding leader dots/dashes, there is a slightly different rule for + // what makes a good neighbour. + // If activate_line_trap, then line-like objects are found and isolated. + void SetNeighbours(bool leaders, bool activate_line_trap, BLOBNBOX* blob); + + // Sets the good_stroke_neighbours member of the blob if it has a + // GoodNeighbour on the given side. + // Also sets the neighbour in the blob, whether or not a good one is found. + // Return value is the number of neighbours in the line trap size range. + // Leaders get extra special lenient treatment. + int FindGoodNeighbour(BlobNeighbourDir dir, bool leaders, BLOBNBOX* blob); + + // Makes the blob to be only horizontal or vertical where evidence + // is clear based on gaps of 2nd order neighbours. + void SetNeighbourFlows(BLOBNBOX* blob); + + // Nullify the neighbours in the wrong directions where the direction + // is clear-cut based on a distance margin. Good for isolating vertical + // text from neighbouring horizontal text. + void SimplifyObviousNeighbours(BLOBNBOX* blob); + + // Smoothes the vertical/horizontal type of the blob based on the + // 2nd-order neighbours. If reset_all is true, then all blobs are + // changed. Otherwise, only ambiguous blobs are processed. + void SmoothNeighbourTypes(PageSegMode pageseg_mode, bool desperate, + BLOBNBOX* blob); + + // Checks the left or right side of the given leader partition and sets the + // (opposite) leader_on_right or leader_on_left flags for blobs + // that are next to the given side of the given leader partition. + void MarkLeaderNeighbours(const ColPartition* part, LeftOrRight side); + + // Partition creation. Accumulates vertical and horizontal text chains, + // puts the remaining blobs in as unknowns, and then merges/splits to + // minimize overlap and smoothes the types with neighbours and the color + // image if provided. rerotation is used to rotate the coordinate space + // back to the nontext_map_ image. + // If find_problems is true, detects possible noise pollution by the amount + // of partition overlap that is created by the diacritics. If excessive, the + // noise is separated out into diacritic blobs, and PFR_NOISE is returned. + // [TODO(rays): if the partition overlap is caused by heavy skew, deskews + // the components, saves the skew_angle and returns PFR_SKEW.] If the return + // is not PFR_OK, the job is incomplete, and FindInitialPartitions must be + // called again after cleaning up the partly done work. + PartitionFindResult FindInitialPartitions(PageSegMode pageseg_mode, + const FCOORD& rerotation, + bool find_problems, TO_BLOCK* block, + BLOBNBOX_LIST* diacritic_blobs, + ColPartitionGrid* part_grid, + ColPartition_LIST* big_parts, + FCOORD* skew_angle); + // Detects noise by a significant increase in partition overlap from + // pre_overlap to now, and removes noise from the union of all the overlapping + // partitions, placing the blobs in diacritic_blobs. Returns true if any noise + // was found and removed. + bool DetectAndRemoveNoise(int pre_overlap, const TBOX& grid_box, + TO_BLOCK* block, ColPartitionGrid* part_grid, + BLOBNBOX_LIST* diacritic_blobs); + // Finds vertical chains of text-like blobs and puts them in ColPartitions. + void FindVerticalTextChains(ColPartitionGrid* part_grid); + // Finds horizontal chains of text-like blobs and puts them in ColPartitions. + void FindHorizontalTextChains(ColPartitionGrid* part_grid); + // Finds diacritics and saves their base character in the blob. + void TestDiacritics(ColPartitionGrid* part_grid, TO_BLOCK* block); + // Searches this grid for an appropriately close and sized neighbour of the + // given [small] blob. If such a blob is found, the diacritic base is saved + // in the blob and true is returned. + // The small_grid is a secondary grid that contains the small/noise objects + // that are not in this grid, but may be useful for determining a connection + // between blob and its potential base character. (See DiacriticXGapFilled.) + bool DiacriticBlob(BlobGrid* small_grid, BLOBNBOX* blob); + // Returns true if there is no gap between the base char and the diacritic + // bigger than a fraction of the height of the base char: + // Eg: line end.....' + // The quote is a long way from the end of the line, yet it needs to be a + // diacritic. To determine that the quote is not part of an image, or + // a different text block, we check for other marks in the gap between + // the base char and the diacritic. + // '<--Diacritic + // |---------| + // | |<-toobig-gap-> + // | Base | + // |---------| x<-----Dot occupying gap + // The grid is const really. + bool DiacriticXGapFilled(BlobGrid* grid, const TBOX& diacritic_box, + const TBOX& base_box); + // Merges diacritics with the ColPartition of the base character blob. + void MergeDiacritics(TO_BLOCK* block, ColPartitionGrid* part_grid); + // Any blobs on the large_blobs list of block that are still unowned by a + // ColPartition, are probably drop-cap or vertically touching so the blobs + // are removed to the big_parts list and treated separately. + void RemoveLargeUnusedBlobs(TO_BLOCK* block, + ColPartitionGrid* part_grid, + ColPartition_LIST* big_parts); + + // All remaining unused blobs are put in individual ColPartitions. + void PartitionRemainingBlobs(PageSegMode pageseg_mode, + ColPartitionGrid* part_grid); + + // If combine, put all blobs in the cell_list into a single partition, + // otherwise put each one into its own partition. + void MakePartitionsFromCellList(PageSegMode pageseg_mode, bool combine, + ColPartitionGrid* part_grid, + BLOBNBOX_CLIST* cell_list); + + // Helper function to finish setting up a ColPartition and insert into + // part_grid. + void CompletePartition(PageSegMode pageseg_mode, ColPartition* part, + ColPartitionGrid* part_grid); + + // Helper returns true if we are looking only for vertical textlines, + // taking into account any rotation that has been done. + bool FindingVerticalOnly(PageSegMode pageseg_mode) const { + if (rerotation_.y() == 0.0f) { + return pageseg_mode == PSM_SINGLE_BLOCK_VERT_TEXT; + } + return !PSM_ORIENTATION_ENABLED(pageseg_mode) && + pageseg_mode != PSM_SINGLE_BLOCK_VERT_TEXT; + } + // Helper returns true if we are looking only for horizontal textlines, + // taking into account any rotation that has been done. + bool FindingHorizontalOnly(PageSegMode pageseg_mode) const { + if (rerotation_.y() == 0.0f) { + return !PSM_ORIENTATION_ENABLED(pageseg_mode) && + pageseg_mode != PSM_SINGLE_BLOCK_VERT_TEXT; + } + return pageseg_mode == PSM_SINGLE_BLOCK_VERT_TEXT; + } + + // Merge partitions where the merge appears harmless. + void EasyMerges(ColPartitionGrid* part_grid); + + // Compute a search box based on the orientation of the partition. + // Returns true if a suitable box can be calculated. + // Callback for EasyMerges. + bool OrientationSearchBox(ColPartition* part, TBOX* box); + + // Merge confirmation callback for EasyMerges. + bool ConfirmEasyMerge(const ColPartition* p1, const ColPartition* p2); + + // Returns true if there is no significant noise in between the boxes. + bool NoNoiseInBetween(const TBOX& box1, const TBOX& box2) const; + + // Displays the blobs colored according to the number of good neighbours + // and the vertical/horizontal flow. + ScrollView* DisplayGoodBlobs(const char* window_name, int x, int y); + + // Displays blobs colored according to whether or not they are diacritics. + ScrollView* DisplayDiacritics(const char* window_name, + int x, int y, TO_BLOCK* block); + + private: + // Image map of photo/noise areas on the page. Borrowed pointer (not owned.) + Pix* nontext_map_; + // Textline projection map. Borrowed pointer. + TextlineProjection* projection_; + // DENORM used by projection_ to get back to image coords. Borrowed pointer. + const DENORM* denorm_; + // Bounding box of the grid. + TBOX grid_box_; + // Rerotation to get back to the original image. + FCOORD rerotation_; + // Windows for debug display. + ScrollView* leaders_win_; + ScrollView* initial_widths_win_; + ScrollView* widths_win_; + ScrollView* chains_win_; + ScrollView* diacritics_win_; + ScrollView* textlines_win_; + ScrollView* smoothed_win_; +}; + +} // namespace tesseract. + +#endif // TESSERACT_TEXTORD_STROKEWIDTH_H_ diff --git a/src/textord/tablefind.h b/src/textord/tablefind.h index 9136605fb5..49590a4f06 100644 --- a/src/textord/tablefind.h +++ b/src/textord/tablefind.h @@ -1,430 +1,430 @@ -/////////////////////////////////////////////////////////////////////// -// File: tablefind.h -// Description: Helper classes to find tables from ColPartitions. -// Author: Faisal Shafait (faisal.shafait@dfki.de) -// Created: Tue Jan 06 11:13:01 PST 2009 -// -// (C) Copyright 2009, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -#ifndef TESSERACT_TEXTORD_TABLEFIND_H_ -#define TESSERACT_TEXTORD_TABLEFIND_H_ - -#include "colpartitiongrid.h" -#include "elst.h" -#include "rect.h" - -namespace tesseract { - -// Possible types for a column segment. -enum ColSegType { - COL_UNKNOWN, - COL_TEXT, - COL_TABLE, - COL_MIXED, - COL_COUNT -}; - -class ColPartitionSet; - -// ColSegment holds rectangular blocks that represent segmentation of a page -// into regions containing single column text/table. -class ColSegment; -ELISTIZEH(ColSegment) -CLISTIZEH(ColSegment) - -class ColSegment : public ELIST_LINK { - public: - ColSegment(); - ~ColSegment(); - - // Simple accessors and mutators - const TBOX& bounding_box() const { - return bounding_box_; - } - - void set_top(int y) { - bounding_box_.set_top(y); - } - - void set_bottom(int y) { - bounding_box_.set_bottom(y); - } - - void set_left(int x) { - bounding_box_.set_left(x); - } - - void set_right(int x) { - bounding_box_.set_right(x); - } - - void set_bounding_box(const TBOX& other) { - bounding_box_ = other; - } - - int get_num_table_cells() const { - return num_table_cells_; - } - - // set the number of table colpartitions covered by the bounding_box_ - void set_num_table_cells(int n) { - num_table_cells_ = n; - } - - int get_num_text_cells() const { - return num_text_cells_; - } - - // set the number of text colpartitions covered by the bounding_box_ - void set_num_text_cells(int n) { - num_text_cells_ = n; - } - - ColSegType type() const { - return type_; - } - - // set the type of the block based on the ratio of table to text - // colpartitions covered by it. - void set_type(); - - // Provides a color for BBGrid to draw the rectangle. - ScrollView::Color BoxColor() const; - - // Insert a rectangle into bounding_box_ - void InsertBox(const TBOX& other); - - private: - TBOX bounding_box_; // bounding box - int num_table_cells_; - int num_text_cells_; - ColSegType type_; -}; - -// Typedef BBGrid of ColSegments -typedef BBGrid ColSegmentGrid; -typedef GridSearch ColSegmentGridSearch; - -// TableFinder is a utility class to find a set of tables given a set of -// ColPartitions and Columns. The TableFinder will mark candidate ColPartitions -// based on research in "Table Detection in Heterogeneous Documents". -// Usage flow is as follows: -// TableFinder finder; -// finder.InsertCleanPartitions(/* grid info */) -// finder.LocateTables(/* ColPartitions and Columns */); -// finder.Update TODO(nbeato) -class TableFinder { - public: - // Constructor is simple initializations - TableFinder(); - ~TableFinder(); - - // Set the resolution of the connected components in ppi. - void set_resolution(int resolution) { - resolution_ = resolution; - } - // Change the reading order. Initially it is left to right. - void set_left_to_right_language(bool order); - - // Initialize - void Init(int grid_size, const ICOORD& bottom_left, const ICOORD& top_right); - - // Copy cleaned partitions from ColumnFinder's part_grid_ to this - // clean_part_grid_ and insert dot-like noise into period_grid_. - // It resizes the grids in this object to the dimensions of grid. - void InsertCleanPartitions(ColPartitionGrid* grid, TO_BLOCK* block); - - // High level function to perform table detection - // Finds tables and updates the grid object with new partitions for the - // tables. The columns and width callbacks are used to merge tables. - // The reskew argument is only used to write the tables to the out.png - // if that feature is enabled. - void LocateTables(ColPartitionGrid* grid, - ColPartitionSet** columns, - WidthCallback* width_cb, - const FCOORD& reskew); - - protected: - // Access for the grid dimensions. - // The results will not be correct until InsertCleanPartitions - // has been called. The values are taken from the grid passed as an argument - // to that function. - int gridsize() const; - int gridwidth() const; - int gridheight() const; - const ICOORD& bleft() const; - const ICOORD& tright() const; - - // Makes a window for debugging, see BBGrid - ScrollView* MakeWindow(int x, int y, const char* window_name); - - //////// Functions to insert objects from the grid into the table finder. - //////// In all cases, ownership is transferred to the table finder. - // Inserts text into the table finder. - void InsertTextPartition(ColPartition* part); - void InsertFragmentedTextPartition(ColPartition* part); - void InsertLeaderPartition(ColPartition* part); - void InsertRulingPartition(ColPartition* part); - void InsertImagePartition(ColPartition* part); - void SplitAndInsertFragmentedTextPartition(ColPartition* part); - bool AllowTextPartition(const ColPartition& part) const; - bool AllowBlob(const BLOBNBOX& blob) const; - - //////// Functions that manipulate ColPartitions in the part_grid_ ///// - //////// to find tables. - //////// - - // Utility function to move segments to col_seg_grid - // Note: Move includes ownership, - // so segments will be be owned by col_seg_grid - void MoveColSegmentsToGrid(ColSegment_LIST* segments, - ColSegmentGrid* col_seg_grid); - - //////// Set up code to run during table detection to correctly - //////// initialize variables on column partitions that are used later. - //////// - - // Initialize the grid and partitions - void InitializePartitions(ColPartitionSet** all_columns); - - // Set left, right and top, bottom spacings of each colpartition. - // Left/right spacings are w.r.t the column boundaries - // Top/bottom spacings are w.r.t. previous and next colpartitions - static void SetPartitionSpacings(ColPartitionGrid* grid, - ColPartitionSet** all_columns); - - // Set spacing and closest neighbors above and below a given colpartition. - void SetVerticalSpacing(ColPartition* part); - - // Set global spacing estimates. This function is dependent on the - // partition spacings. So make sure SetPartitionSpacings is called - // on the same grid before this. - void SetGlobalSpacings(ColPartitionGrid* grid); - // Access to the global median xheight. The xheight is the height - // of a lowercase 'x' character on the page. This can be viewed as the - // average height of a lowercase letter in a textline. As a result - // it is used to make assumptions about spacing between words and - // table cells. - void set_global_median_xheight(int xheight); - // Access to the global median blob width. The width is useful - // when deciding if a partition is noise. - void set_global_median_blob_width(int width); - // Access to the global median ledding. The ledding is the distance between - // two adjacent text lines. This value can be used to get a rough estimate - // for the amount of space between two lines of text. As a result, it - // is used to calculate appropriate spacing between adjacent rows of text. - void set_global_median_ledding(int ledding); - - // Updates the nearest neighbors for each ColPartition in clean_part_grid_. - // The neighbors are most likely SingletonPartner calls after the neighbors - // are assigned. This is hear until it is decided to remove the - // nearest_neighbor code in ColPartition - void FindNeighbors(); - - //////// Functions to mark candidate column partitions as tables. - //////// Tables are marked as described in - //////// Table Detection in Heterogeneous Documents (2010, Shafait & Smith) - //////// - - // High level function to mark partitions as table rows/cells. - // When this function is done, the column partitions in clean_part_grid_ - // should mostly be marked as tables. - void MarkTablePartitions(); - // Marks partitions given a local view of a single partition - void MarkPartitionsUsingLocalInformation(); - /////// Heuristics for local marking - // Check if the partition has at least one large gap between words or no - // significant gap at all - // TODO(nbeato): Make const, prevented because blobnbox array access - bool HasWideOrNoInterWordGap(ColPartition* part) const; - // Checks if a partition is adjacent to leaders on the page - bool HasLeaderAdjacent(const ColPartition& part); - // Filter individual text partitions marked as table partitions - // consisting of paragraph endings, small section headings, and - // headers and footers. - void FilterFalseAlarms(); - void FilterParagraphEndings(); - void FilterHeaderAndFooter(); - // Mark all ColPartitions as table cells that have a table cell above - // and below them - void SmoothTablePartitionRuns(); - - //////// Functions to create bounding boxes (ColSegment) objects for - //////// the columns on the page. The columns are not necessarily - //////// vertical lines, meaning if tab stops strongly suggests that - //////// a column changes horizontal position, as in the case below, - //////// The ColSegment objects will respect that after processing. - //////// - //////// _____________ - //////// Ex. | | | - //////// |_____|______| 5 boxes: 2 on this line - //////// | | | | 3 on this line - //////// |___|____|___| - //////// - - // Get Column segments from best_columns_ - void GetColumnBlocks(ColPartitionSet** columns, - ColSegment_LIST *col_segments); - - // Group Column segments into consecutive single column regions. - void GroupColumnBlocks(ColSegment_LIST *current_segments, - ColSegment_LIST *col_segments); - - // Check if two boxes are consecutive within the same column - bool ConsecutiveBoxes(const TBOX &b1, const TBOX &b2); - - // Set the ratio of candidate table partitions in each column - void SetColumnsType(ColSegment_LIST* col_segments); - - // Merge Column Blocks that were split due to the presence of a table - void GridMergeColumnBlocks(); - - //////// Functions to turn marked ColPartitions into candidate tables - //////// using a modified T-Recs++ algorithm described in - //////// Applying The T-Recs Table Recognition System - //////// To The Business Letter Domain (2001, Kieninger & Dengel) - //////// - - // Merge partititons cells into table columns - // Differs from paper by just looking at marked table partitions - // instead of similarity metric. - // Modified section 4.1 of paper. - void GetTableColumns(ColSegment_LIST *table_columns); - - // Finds regions within a column that potentially contain a table. - // Ie, the table columns from GetTableColumns are turned into boxes - // that span the entire page column (using ColumnBlocks found in - // earlier functions) in the x direction and the min/max extent of - // overlapping table columns in the y direction. - // Section 4.2 of paper. - void GetTableRegions(ColSegment_LIST *table_columns, - ColSegment_LIST *table_regions); - - - //////// Functions to "patch up" found tables - //////// - - // Merge table regions corresponding to tables spanning multiple columns - void GridMergeTableRegions(); - bool BelongToOneTable(const TBOX &box1, const TBOX &box2); - - // Adjust table boundaries by building a tight bounding box around all - // ColPartitions contained in it. - void AdjustTableBoundaries(); - - // Grows a table to include partitions that are partially covered - // by the table. This includes lines and text. It does not include - // noise or images. - // On entry, result_box is the minimum size of the result. The results of the - // function will union the actual result with result_box. - void GrowTableBox(const TBOX& table_box, TBOX* result_box); - // Grow a table by increasing the size of the box to include - // partitions with significant overlap with the table. - void GrowTableToIncludePartials(const TBOX& table_box, - const TBOX& search_range, - TBOX* result_box); - // Grow a table by expanding to the extents of significantly - // overlapping lines. - void GrowTableToIncludeLines(const TBOX& table_box, const TBOX& search_range, - TBOX* result_box); - // Checks whether the horizontal line belong to the table by looking at the - // side spacing of extra ColParitions that will be included in the table - // due to expansion - bool HLineBelongsToTable(const ColPartition& part, const TBOX& table_box); - - // Look for isolated column headers above the given table box and - // include them in the table - void IncludeLeftOutColumnHeaders(TBOX* table_box); - - // Remove false alarms consiting of a single column - void DeleteSingleColumnTables(); - - // Return true if at least one gap larger than the global x-height - // exists in the horizontal projection - bool GapInXProjection(int* xprojection, int length); - - //////// Recognize the tables. - //////// - // This function will run the table recognizer and try to find better - // bounding boxes. The structures of the tables never leave this function - // right now. It just tries to prune and merge tables based on info it - // has available. - void RecognizeTables(); - - //////// Debugging functions. Render different structures to GUI - //////// for visual debugging / intuition. - //////// - - // Displays Colpartitions marked as table row. Overlays them on top of - // part_grid_. - void DisplayColSegments(ScrollView* win, ColSegment_LIST *cols, - ScrollView::Color color); - - // Displays the colpartitions using a new coloring on an existing window. - // Note: This method is only for debug purpose during development and - // would not be part of checked in code - void DisplayColPartitions(ScrollView* win, ColPartitionGrid* grid, - ScrollView::Color text_color, - ScrollView::Color table_color); - void DisplayColPartitions(ScrollView* win, ColPartitionGrid* grid, - ScrollView::Color default_color); - void DisplayColPartitionConnections(ScrollView* win, - ColPartitionGrid* grid, - ScrollView::Color default_color); - void DisplayColSegmentGrid(ScrollView* win, ColSegmentGrid* grid, - ScrollView::Color color); - - // Merge all colpartitions in table regions to make them a single - // colpartition and revert types of isolated table cells not - // assigned to any table to their original types. - void MakeTableBlocks(ColPartitionGrid* grid, - ColPartitionSet** columns, - WidthCallback* width_cb); - - ///////////////////////////////////////////////// - // Useful objects used during table find process. - ///////////////////////////////////////////////// - // Resolution of the connected components in ppi. - int resolution_; - // Estimate of median x-height over the page - int global_median_xheight_; - // Estimate of the median blob width on the page - int global_median_blob_width_; - // Estimate of median leading on the page - int global_median_ledding_; - // Grid to hold cleaned colpartitions after removing all - // colpartitions that consist of only noise blobs, and removing - // noise blobs from remaining colpartitions. - ColPartitionGrid clean_part_grid_; - // Grid contains the leaders and ruling lines. - ColPartitionGrid leader_and_ruling_grid_; - // Grid contains the broken down column partitions. It can be thought - // of as a "word" grid. However, it usually doesn't break apart text lines. - // It does break apart table data (most of the time). - ColPartitionGrid fragmented_text_grid_; - // Grid of page column blocks - ColSegmentGrid col_seg_grid_; - // Grid of detected tables - ColSegmentGrid table_grid_; - // The reading order of text. Defaults to true, for languages such as English. - bool left_to_right_language_; -}; - -} // namespace tesseract. - -#endif // TESSERACT_TEXTORD_TABLEFIND_H_ +/////////////////////////////////////////////////////////////////////// +// File: tablefind.h +// Description: Helper classes to find tables from ColPartitions. +// Author: Faisal Shafait (faisal.shafait@dfki.de) +// Created: Tue Jan 06 11:13:01 PST 2009 +// +// (C) Copyright 2009, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +#ifndef TESSERACT_TEXTORD_TABLEFIND_H_ +#define TESSERACT_TEXTORD_TABLEFIND_H_ + +#include "colpartitiongrid.h" +#include "elst.h" +#include "rect.h" + +namespace tesseract { + +// Possible types for a column segment. +enum ColSegType { + COL_UNKNOWN, + COL_TEXT, + COL_TABLE, + COL_MIXED, + COL_COUNT +}; + +class ColPartitionSet; + +// ColSegment holds rectangular blocks that represent segmentation of a page +// into regions containing single column text/table. +class ColSegment; +ELISTIZEH(ColSegment) +CLISTIZEH(ColSegment) + +class ColSegment : public ELIST_LINK { + public: + ColSegment(); + ~ColSegment(); + + // Simple accessors and mutators + const TBOX& bounding_box() const { + return bounding_box_; + } + + void set_top(int y) { + bounding_box_.set_top(y); + } + + void set_bottom(int y) { + bounding_box_.set_bottom(y); + } + + void set_left(int x) { + bounding_box_.set_left(x); + } + + void set_right(int x) { + bounding_box_.set_right(x); + } + + void set_bounding_box(const TBOX& other) { + bounding_box_ = other; + } + + int get_num_table_cells() const { + return num_table_cells_; + } + + // set the number of table colpartitions covered by the bounding_box_ + void set_num_table_cells(int n) { + num_table_cells_ = n; + } + + int get_num_text_cells() const { + return num_text_cells_; + } + + // set the number of text colpartitions covered by the bounding_box_ + void set_num_text_cells(int n) { + num_text_cells_ = n; + } + + ColSegType type() const { + return type_; + } + + // set the type of the block based on the ratio of table to text + // colpartitions covered by it. + void set_type(); + + // Provides a color for BBGrid to draw the rectangle. + ScrollView::Color BoxColor() const; + + // Insert a rectangle into bounding_box_ + void InsertBox(const TBOX& other); + + private: + TBOX bounding_box_; // bounding box + int num_table_cells_; + int num_text_cells_; + ColSegType type_; +}; + +// Typedef BBGrid of ColSegments +typedef BBGrid ColSegmentGrid; +typedef GridSearch ColSegmentGridSearch; + +// TableFinder is a utility class to find a set of tables given a set of +// ColPartitions and Columns. The TableFinder will mark candidate ColPartitions +// based on research in "Table Detection in Heterogeneous Documents". +// Usage flow is as follows: +// TableFinder finder; +// finder.InsertCleanPartitions(/* grid info */) +// finder.LocateTables(/* ColPartitions and Columns */); +// finder.Update TODO(nbeato) +class TableFinder { + public: + // Constructor is simple initializations + TableFinder(); + ~TableFinder(); + + // Set the resolution of the connected components in ppi. + void set_resolution(int resolution) { + resolution_ = resolution; + } + // Change the reading order. Initially it is left to right. + void set_left_to_right_language(bool order); + + // Initialize + void Init(int grid_size, const ICOORD& bottom_left, const ICOORD& top_right); + + // Copy cleaned partitions from ColumnFinder's part_grid_ to this + // clean_part_grid_ and insert dot-like noise into period_grid_. + // It resizes the grids in this object to the dimensions of grid. + void InsertCleanPartitions(ColPartitionGrid* grid, TO_BLOCK* block); + + // High level function to perform table detection + // Finds tables and updates the grid object with new partitions for the + // tables. The columns and width callbacks are used to merge tables. + // The reskew argument is only used to write the tables to the out.png + // if that feature is enabled. + void LocateTables(ColPartitionGrid* grid, + ColPartitionSet** columns, + WidthCallback* width_cb, + const FCOORD& reskew); + + protected: + // Access for the grid dimensions. + // The results will not be correct until InsertCleanPartitions + // has been called. The values are taken from the grid passed as an argument + // to that function. + int gridsize() const; + int gridwidth() const; + int gridheight() const; + const ICOORD& bleft() const; + const ICOORD& tright() const; + + // Makes a window for debugging, see BBGrid + ScrollView* MakeWindow(int x, int y, const char* window_name); + + //////// Functions to insert objects from the grid into the table finder. + //////// In all cases, ownership is transferred to the table finder. + // Inserts text into the table finder. + void InsertTextPartition(ColPartition* part); + void InsertFragmentedTextPartition(ColPartition* part); + void InsertLeaderPartition(ColPartition* part); + void InsertRulingPartition(ColPartition* part); + void InsertImagePartition(ColPartition* part); + void SplitAndInsertFragmentedTextPartition(ColPartition* part); + bool AllowTextPartition(const ColPartition& part) const; + bool AllowBlob(const BLOBNBOX& blob) const; + + //////// Functions that manipulate ColPartitions in the part_grid_ ///// + //////// to find tables. + //////// + + // Utility function to move segments to col_seg_grid + // Note: Move includes ownership, + // so segments will be be owned by col_seg_grid + void MoveColSegmentsToGrid(ColSegment_LIST* segments, + ColSegmentGrid* col_seg_grid); + + //////// Set up code to run during table detection to correctly + //////// initialize variables on column partitions that are used later. + //////// + + // Initialize the grid and partitions + void InitializePartitions(ColPartitionSet** all_columns); + + // Set left, right and top, bottom spacings of each colpartition. + // Left/right spacings are w.r.t the column boundaries + // Top/bottom spacings are w.r.t. previous and next colpartitions + static void SetPartitionSpacings(ColPartitionGrid* grid, + ColPartitionSet** all_columns); + + // Set spacing and closest neighbors above and below a given colpartition. + void SetVerticalSpacing(ColPartition* part); + + // Set global spacing estimates. This function is dependent on the + // partition spacings. So make sure SetPartitionSpacings is called + // on the same grid before this. + void SetGlobalSpacings(ColPartitionGrid* grid); + // Access to the global median xheight. The xheight is the height + // of a lowercase 'x' character on the page. This can be viewed as the + // average height of a lowercase letter in a textline. As a result + // it is used to make assumptions about spacing between words and + // table cells. + void set_global_median_xheight(int xheight); + // Access to the global median blob width. The width is useful + // when deciding if a partition is noise. + void set_global_median_blob_width(int width); + // Access to the global median ledding. The ledding is the distance between + // two adjacent text lines. This value can be used to get a rough estimate + // for the amount of space between two lines of text. As a result, it + // is used to calculate appropriate spacing between adjacent rows of text. + void set_global_median_ledding(int ledding); + + // Updates the nearest neighbors for each ColPartition in clean_part_grid_. + // The neighbors are most likely SingletonPartner calls after the neighbors + // are assigned. This is hear until it is decided to remove the + // nearest_neighbor code in ColPartition + void FindNeighbors(); + + //////// Functions to mark candidate column partitions as tables. + //////// Tables are marked as described in + //////// Table Detection in Heterogeneous Documents (2010, Shafait & Smith) + //////// + + // High level function to mark partitions as table rows/cells. + // When this function is done, the column partitions in clean_part_grid_ + // should mostly be marked as tables. + void MarkTablePartitions(); + // Marks partitions given a local view of a single partition + void MarkPartitionsUsingLocalInformation(); + /////// Heuristics for local marking + // Check if the partition has at least one large gap between words or no + // significant gap at all + // TODO(nbeato): Make const, prevented because blobnbox array access + bool HasWideOrNoInterWordGap(ColPartition* part) const; + // Checks if a partition is adjacent to leaders on the page + bool HasLeaderAdjacent(const ColPartition& part); + // Filter individual text partitions marked as table partitions + // consisting of paragraph endings, small section headings, and + // headers and footers. + void FilterFalseAlarms(); + void FilterParagraphEndings(); + void FilterHeaderAndFooter(); + // Mark all ColPartitions as table cells that have a table cell above + // and below them + void SmoothTablePartitionRuns(); + + //////// Functions to create bounding boxes (ColSegment) objects for + //////// the columns on the page. The columns are not necessarily + //////// vertical lines, meaning if tab stops strongly suggests that + //////// a column changes horizontal position, as in the case below, + //////// The ColSegment objects will respect that after processing. + //////// + //////// _____________ + //////// Ex. | | | + //////// |_____|______| 5 boxes: 2 on this line + //////// | | | | 3 on this line + //////// |___|____|___| + //////// + + // Get Column segments from best_columns_ + void GetColumnBlocks(ColPartitionSet** columns, + ColSegment_LIST *col_segments); + + // Group Column segments into consecutive single column regions. + void GroupColumnBlocks(ColSegment_LIST *current_segments, + ColSegment_LIST *col_segments); + + // Check if two boxes are consecutive within the same column + bool ConsecutiveBoxes(const TBOX &b1, const TBOX &b2); + + // Set the ratio of candidate table partitions in each column + void SetColumnsType(ColSegment_LIST* col_segments); + + // Merge Column Blocks that were split due to the presence of a table + void GridMergeColumnBlocks(); + + //////// Functions to turn marked ColPartitions into candidate tables + //////// using a modified T-Recs++ algorithm described in + //////// Applying The T-Recs Table Recognition System + //////// To The Business Letter Domain (2001, Kieninger & Dengel) + //////// + + // Merge partititons cells into table columns + // Differs from paper by just looking at marked table partitions + // instead of similarity metric. + // Modified section 4.1 of paper. + void GetTableColumns(ColSegment_LIST *table_columns); + + // Finds regions within a column that potentially contain a table. + // Ie, the table columns from GetTableColumns are turned into boxes + // that span the entire page column (using ColumnBlocks found in + // earlier functions) in the x direction and the min/max extent of + // overlapping table columns in the y direction. + // Section 4.2 of paper. + void GetTableRegions(ColSegment_LIST *table_columns, + ColSegment_LIST *table_regions); + + + //////// Functions to "patch up" found tables + //////// + + // Merge table regions corresponding to tables spanning multiple columns + void GridMergeTableRegions(); + bool BelongToOneTable(const TBOX &box1, const TBOX &box2); + + // Adjust table boundaries by building a tight bounding box around all + // ColPartitions contained in it. + void AdjustTableBoundaries(); + + // Grows a table to include partitions that are partially covered + // by the table. This includes lines and text. It does not include + // noise or images. + // On entry, result_box is the minimum size of the result. The results of the + // function will union the actual result with result_box. + void GrowTableBox(const TBOX& table_box, TBOX* result_box); + // Grow a table by increasing the size of the box to include + // partitions with significant overlap with the table. + void GrowTableToIncludePartials(const TBOX& table_box, + const TBOX& search_range, + TBOX* result_box); + // Grow a table by expanding to the extents of significantly + // overlapping lines. + void GrowTableToIncludeLines(const TBOX& table_box, const TBOX& search_range, + TBOX* result_box); + // Checks whether the horizontal line belong to the table by looking at the + // side spacing of extra ColParitions that will be included in the table + // due to expansion + bool HLineBelongsToTable(const ColPartition& part, const TBOX& table_box); + + // Look for isolated column headers above the given table box and + // include them in the table + void IncludeLeftOutColumnHeaders(TBOX* table_box); + + // Remove false alarms consiting of a single column + void DeleteSingleColumnTables(); + + // Return true if at least one gap larger than the global x-height + // exists in the horizontal projection + bool GapInXProjection(int* xprojection, int length); + + //////// Recognize the tables. + //////// + // This function will run the table recognizer and try to find better + // bounding boxes. The structures of the tables never leave this function + // right now. It just tries to prune and merge tables based on info it + // has available. + void RecognizeTables(); + + //////// Debugging functions. Render different structures to GUI + //////// for visual debugging / intuition. + //////// + + // Displays Colpartitions marked as table row. Overlays them on top of + // part_grid_. + void DisplayColSegments(ScrollView* win, ColSegment_LIST *cols, + ScrollView::Color color); + + // Displays the colpartitions using a new coloring on an existing window. + // Note: This method is only for debug purpose during development and + // would not be part of checked in code + void DisplayColPartitions(ScrollView* win, ColPartitionGrid* grid, + ScrollView::Color text_color, + ScrollView::Color table_color); + void DisplayColPartitions(ScrollView* win, ColPartitionGrid* grid, + ScrollView::Color default_color); + void DisplayColPartitionConnections(ScrollView* win, + ColPartitionGrid* grid, + ScrollView::Color default_color); + void DisplayColSegmentGrid(ScrollView* win, ColSegmentGrid* grid, + ScrollView::Color color); + + // Merge all colpartitions in table regions to make them a single + // colpartition and revert types of isolated table cells not + // assigned to any table to their original types. + void MakeTableBlocks(ColPartitionGrid* grid, + ColPartitionSet** columns, + WidthCallback* width_cb); + + ///////////////////////////////////////////////// + // Useful objects used during table find process. + ///////////////////////////////////////////////// + // Resolution of the connected components in ppi. + int resolution_; + // Estimate of median x-height over the page + int global_median_xheight_; + // Estimate of the median blob width on the page + int global_median_blob_width_; + // Estimate of median leading on the page + int global_median_ledding_; + // Grid to hold cleaned colpartitions after removing all + // colpartitions that consist of only noise blobs, and removing + // noise blobs from remaining colpartitions. + ColPartitionGrid clean_part_grid_; + // Grid contains the leaders and ruling lines. + ColPartitionGrid leader_and_ruling_grid_; + // Grid contains the broken down column partitions. It can be thought + // of as a "word" grid. However, it usually doesn't break apart text lines. + // It does break apart table data (most of the time). + ColPartitionGrid fragmented_text_grid_; + // Grid of page column blocks + ColSegmentGrid col_seg_grid_; + // Grid of detected tables + ColSegmentGrid table_grid_; + // The reading order of text. Defaults to true, for languages such as English. + bool left_to_right_language_; +}; + +} // namespace tesseract. + +#endif // TESSERACT_TEXTORD_TABLEFIND_H_ diff --git a/src/textord/tordmain.h b/src/textord/tordmain.h index ec3b98b3ab..cb5a6a1ef2 100644 --- a/src/textord/tordmain.h +++ b/src/textord/tordmain.h @@ -1,42 +1,42 @@ -/********************************************************************** - * File: tordmain.h (Formerly textordp.h) - * Description: C++ top level textord code. - * Author: Ray Smith - * Created: Tue Jul 28 17:12:33 BST 1992 - * - * (C) Copyright 1992, Hewlett-Packard Ltd. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -#ifndef TORDMAIN_H -#define TORDMAIN_H - -#include -#include "params.h" -#include "ocrblock.h" -#include "blobs.h" -#include "blobbox.h" - -struct Pix; -namespace tesseract { -class Tesseract; - -void SetBlobStrokeWidth(Pix* pix, BLOBNBOX* blob); -void assign_blobs_to_blocks2(Pix* pix, BLOCK_LIST *blocks, - TO_BLOCK_LIST *port_blocks); -} // namespace tesseract - -void tweak_row_baseline(ROW *row, - double blshift_maxshift, - double blshift_xfraction); - -#endif +/********************************************************************** + * File: tordmain.h (Formerly textordp.h) + * Description: C++ top level textord code. + * Author: Ray Smith + * Created: Tue Jul 28 17:12:33 BST 1992 + * + * (C) Copyright 1992, Hewlett-Packard Ltd. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +#ifndef TORDMAIN_H +#define TORDMAIN_H + +#include +#include "params.h" +#include "ocrblock.h" +#include "blobs.h" +#include "blobbox.h" + +struct Pix; +namespace tesseract { +class Tesseract; + +void SetBlobStrokeWidth(Pix* pix, BLOBNBOX* blob); +void assign_blobs_to_blocks2(Pix* pix, BLOCK_LIST *blocks, + TO_BLOCK_LIST *port_blocks); +} // namespace tesseract + +void tweak_row_baseline(ROW *row, + double blshift_maxshift, + double blshift_xfraction); + +#endif diff --git a/src/textord/tovars.cpp b/src/textord/tovars.cpp index 4edc8b5849..6b1b833248 100644 --- a/src/textord/tovars.cpp +++ b/src/textord/tovars.cpp @@ -1,83 +1,83 @@ -/********************************************************************** - * File: tovars.cpp (Formerly to_vars.c) - * Description: Variables used by textord. - * Author: Ray Smith - * Created: Tue Aug 24 16:55:02 BST 1993 - * - * (C) Copyright 1993, Hewlett-Packard Ltd. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -#include "tovars.h" -#include "params.h" - -#define EXTERN - -EXTERN BOOL_VAR (textord_show_initial_words, FALSE, "Display separate words"); -EXTERN BOOL_VAR (textord_show_new_words, FALSE, "Display separate words"); -EXTERN BOOL_VAR (textord_show_fixed_words, FALSE, -"Display forced fixed pitch words"); -EXTERN BOOL_VAR (textord_blocksall_fixed, FALSE, "Moan about prop blocks"); -EXTERN BOOL_VAR (textord_blocksall_prop, FALSE, -"Moan about fixed pitch blocks"); -EXTERN BOOL_VAR (textord_blocksall_testing, FALSE, "Dump stats when moaning"); -EXTERN BOOL_VAR (textord_test_mode, FALSE, "Do current test"); -EXTERN INT_VAR (textord_dotmatrix_gap, 3, -"Max pixel gap for broken pixed pitch"); -EXTERN INT_VAR (textord_debug_block, 0, "Block to do debug on"); -EXTERN INT_VAR (textord_pitch_range, 2, "Max range test on pitch"); -EXTERN double_VAR (textord_wordstats_smooth_factor, 0.05, -"Smoothing gap stats"); -EXTERN double_VAR (textord_width_smooth_factor, 0.10, -"Smoothing width stats"); -EXTERN double_VAR (textord_words_width_ile, 0.4, -"Ile of blob widths for space est"); -EXTERN double_VAR (textord_words_maxspace, 4.0, "Multiple of xheight"); -EXTERN double_VAR (textord_words_default_maxspace, 3.5, -"Max believable third space"); -EXTERN double_VAR (textord_words_default_minspace, 0.6, -"Fraction of xheight"); -EXTERN double_VAR (textord_words_min_minspace, 0.3, "Fraction of xheight"); -EXTERN double_VAR (textord_words_default_nonspace, 0.2, -"Fraction of xheight"); -EXTERN double_VAR(textord_words_initial_lower, 0.25, - "Max initial cluster size"); -EXTERN double_VAR (textord_words_initial_upper, 0.15, -"Min initial cluster spacing"); -EXTERN double_VAR (textord_words_minlarge, 0.75, -"Fraction of valid gaps needed"); -EXTERN double_VAR (textord_words_pitchsd_threshold, 0.040, -"Pitch sync threshold"); -EXTERN double_VAR (textord_words_def_fixed, 0.016, -"Threshold for definite fixed"); -EXTERN double_VAR (textord_words_def_prop, 0.090, -"Threshold for definite prop"); -EXTERN INT_VAR (textord_words_veto_power, 5, -"Rows required to outvote a veto"); -EXTERN double_VAR (textord_pitch_rowsimilarity, 0.08, -"Fraction of xheight for sameness"); -EXTERN BOOL_VAR (textord_pitch_scalebigwords, FALSE, -"Scale scores on big words"); -EXTERN double_VAR(words_initial_lower, 0.5, "Max initial cluster size"); -EXTERN double_VAR (words_initial_upper, 0.15, "Min initial cluster spacing"); -EXTERN double_VAR (words_default_prop_nonspace, 0.25, "Fraction of xheight"); -EXTERN double_VAR (words_default_fixed_space, 0.75, "Fraction of xheight"); -EXTERN double_VAR (words_default_fixed_limit, 0.6, "Allowed size variance"); -EXTERN double_VAR (textord_words_definite_spread, 0.30, -"Non-fuzzy spacing region"); -EXTERN double_VAR (textord_spacesize_ratiofp, 2.8, -"Min ratio space/nonspace"); -EXTERN double_VAR (textord_spacesize_ratioprop, 2.0, -"Min ratio space/nonspace"); -EXTERN double_VAR (textord_fpiqr_ratio, 1.5, "Pitch IQR/Gap IQR threshold"); -EXTERN double_VAR (textord_max_pitch_iqr, 0.20, "Xh fraction noise in pitch"); -EXTERN double_VAR (textord_fp_min_width, 0.5, "Min width of decent blobs"); +/********************************************************************** + * File: tovars.cpp (Formerly to_vars.c) + * Description: Variables used by textord. + * Author: Ray Smith + * Created: Tue Aug 24 16:55:02 BST 1993 + * + * (C) Copyright 1993, Hewlett-Packard Ltd. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +#include "tovars.h" +#include "params.h" + +#define EXTERN + +EXTERN BOOL_VAR (textord_show_initial_words, FALSE, "Display separate words"); +EXTERN BOOL_VAR (textord_show_new_words, FALSE, "Display separate words"); +EXTERN BOOL_VAR (textord_show_fixed_words, FALSE, +"Display forced fixed pitch words"); +EXTERN BOOL_VAR (textord_blocksall_fixed, FALSE, "Moan about prop blocks"); +EXTERN BOOL_VAR (textord_blocksall_prop, FALSE, +"Moan about fixed pitch blocks"); +EXTERN BOOL_VAR (textord_blocksall_testing, FALSE, "Dump stats when moaning"); +EXTERN BOOL_VAR (textord_test_mode, FALSE, "Do current test"); +EXTERN INT_VAR (textord_dotmatrix_gap, 3, +"Max pixel gap for broken pixed pitch"); +EXTERN INT_VAR (textord_debug_block, 0, "Block to do debug on"); +EXTERN INT_VAR (textord_pitch_range, 2, "Max range test on pitch"); +EXTERN double_VAR (textord_wordstats_smooth_factor, 0.05, +"Smoothing gap stats"); +EXTERN double_VAR (textord_width_smooth_factor, 0.10, +"Smoothing width stats"); +EXTERN double_VAR (textord_words_width_ile, 0.4, +"Ile of blob widths for space est"); +EXTERN double_VAR (textord_words_maxspace, 4.0, "Multiple of xheight"); +EXTERN double_VAR (textord_words_default_maxspace, 3.5, +"Max believable third space"); +EXTERN double_VAR (textord_words_default_minspace, 0.6, +"Fraction of xheight"); +EXTERN double_VAR (textord_words_min_minspace, 0.3, "Fraction of xheight"); +EXTERN double_VAR (textord_words_default_nonspace, 0.2, +"Fraction of xheight"); +EXTERN double_VAR(textord_words_initial_lower, 0.25, + "Max initial cluster size"); +EXTERN double_VAR (textord_words_initial_upper, 0.15, +"Min initial cluster spacing"); +EXTERN double_VAR (textord_words_minlarge, 0.75, +"Fraction of valid gaps needed"); +EXTERN double_VAR (textord_words_pitchsd_threshold, 0.040, +"Pitch sync threshold"); +EXTERN double_VAR (textord_words_def_fixed, 0.016, +"Threshold for definite fixed"); +EXTERN double_VAR (textord_words_def_prop, 0.090, +"Threshold for definite prop"); +EXTERN INT_VAR (textord_words_veto_power, 5, +"Rows required to outvote a veto"); +EXTERN double_VAR (textord_pitch_rowsimilarity, 0.08, +"Fraction of xheight for sameness"); +EXTERN BOOL_VAR (textord_pitch_scalebigwords, FALSE, +"Scale scores on big words"); +EXTERN double_VAR(words_initial_lower, 0.5, "Max initial cluster size"); +EXTERN double_VAR (words_initial_upper, 0.15, "Min initial cluster spacing"); +EXTERN double_VAR (words_default_prop_nonspace, 0.25, "Fraction of xheight"); +EXTERN double_VAR (words_default_fixed_space, 0.75, "Fraction of xheight"); +EXTERN double_VAR (words_default_fixed_limit, 0.6, "Allowed size variance"); +EXTERN double_VAR (textord_words_definite_spread, 0.30, +"Non-fuzzy spacing region"); +EXTERN double_VAR (textord_spacesize_ratiofp, 2.8, +"Min ratio space/nonspace"); +EXTERN double_VAR (textord_spacesize_ratioprop, 2.0, +"Min ratio space/nonspace"); +EXTERN double_VAR (textord_fpiqr_ratio, 1.5, "Pitch IQR/Gap IQR threshold"); +EXTERN double_VAR (textord_max_pitch_iqr, 0.20, "Xh fraction noise in pitch"); +EXTERN double_VAR (textord_fp_min_width, 0.5, "Min width of decent blobs"); diff --git a/src/textord/tovars.h b/src/textord/tovars.h index 14a245153e..46315bb96b 100644 --- a/src/textord/tovars.h +++ b/src/textord/tovars.h @@ -1,89 +1,89 @@ -/********************************************************************** - * File: tovars.h (Formerly to_vars.h) - * Description: Variables used by textord. - * Author: Ray Smith - * Created: Tue Aug 24 16:55:02 BST 1993 - * - * (C) Copyright 1993, Hewlett-Packard Ltd. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -#ifndef TOVARS_H -#define TOVARS_H - -#include "params.h" - -extern BOOL_VAR_H (textord_show_initial_words, FALSE, -"Display separate words"); -extern BOOL_VAR_H (textord_show_new_words, FALSE, "Display separate words"); -extern BOOL_VAR_H (textord_show_fixed_words, FALSE, -"Display forced fixed pitch words"); -extern BOOL_VAR_H (textord_blocksall_fixed, FALSE, "Moan about prop blocks"); -extern BOOL_VAR_H (textord_blocksall_prop, FALSE, -"Moan about fixed pitch blocks"); -extern BOOL_VAR_H (textord_blocksall_testing, FALSE, -"Dump stats when moaning"); -extern BOOL_VAR_H (textord_test_mode, FALSE, "Do current test"); -extern INT_VAR_H (textord_dotmatrix_gap, 3, -"Max pixel gap for broken pixed pitch"); -extern INT_VAR_H (textord_debug_block, 0, "Block to do debug on"); -extern INT_VAR_H (textord_pitch_range, 2, "Max range test on pitch"); -extern double_VAR_H (textord_wordstats_smooth_factor, 0.05, -"Smoothing gap stats"); -extern double_VAR_H (textord_width_smooth_factor, 0.10, -"Smoothing width stats"); -extern double_VAR_H (textord_words_width_ile, 0.4, -"Ile of blob widths for space est"); -extern double_VAR_H (textord_words_maxspace, 4.0, "Multiple of xheight"); -extern double_VAR_H (textord_words_default_maxspace, 3.5, -"Max believable third space"); -extern double_VAR_H (textord_words_default_minspace, 0.6, -"Fraction of xheight"); -extern double_VAR_H (textord_words_min_minspace, 0.3, "Fraction of xheight"); -extern double_VAR_H (textord_words_default_nonspace, 0.2, -"Fraction of xheight"); -extern double_VAR_H(textord_words_initial_lower, 0.25, - "Max initial cluster size"); -extern double_VAR_H (textord_words_initial_upper, 0.15, -"Min initial cluster spacing"); -extern double_VAR_H (textord_words_minlarge, 0.75, -"Fraction of valid gaps needed"); -extern double_VAR_H (textord_words_pitchsd_threshold, 0.025, -"Pitch sync threshold"); -extern double_VAR_H (textord_words_def_fixed, 0.01, -"Threshold for definite fixed"); -extern double_VAR_H (textord_words_def_prop, 0.06, -"Threshold for definite prop"); -extern INT_VAR_H (textord_words_veto_power, 5, -"Rows required to outvote a veto"); -extern double_VAR_H (textord_pitch_rowsimilarity, 0.08, -"Fraction of xheight for sameness"); -extern BOOL_VAR_H (textord_pitch_scalebigwords, FALSE, -"Scale scores on big words"); -extern double_VAR_H(words_initial_lower, 0.5, "Max initial cluster size"); -extern double_VAR_H (words_initial_upper, 0.15, -"Min initial cluster spacing"); -extern double_VAR_H (words_default_prop_nonspace, 0.25, -"Fraction of xheight"); -extern double_VAR_H (words_default_fixed_space, 0.75, "Fraction of xheight"); -extern double_VAR_H (words_default_fixed_limit, 0.6, "Allowed size variance"); -extern double_VAR_H (textord_words_definite_spread, 0.30, -"Non-fuzzy spacing region"); -extern double_VAR_H (textord_spacesize_ratiofp, 2.8, -"Min ratio space/nonspace"); -extern double_VAR_H (textord_spacesize_ratioprop, 2.0, -"Min ratio space/nonspace"); -extern double_VAR_H (textord_fpiqr_ratio, 1.5, "Pitch IQR/Gap IQR threshold"); -extern double_VAR_H (textord_max_pitch_iqr, 0.20, -"Xh fraction noise in pitch"); -extern double_VAR_H (textord_fp_min_width, 0.5, "Min width of decent blobs"); -#endif +/********************************************************************** + * File: tovars.h (Formerly to_vars.h) + * Description: Variables used by textord. + * Author: Ray Smith + * Created: Tue Aug 24 16:55:02 BST 1993 + * + * (C) Copyright 1993, Hewlett-Packard Ltd. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +#ifndef TOVARS_H +#define TOVARS_H + +#include "params.h" + +extern BOOL_VAR_H (textord_show_initial_words, FALSE, +"Display separate words"); +extern BOOL_VAR_H (textord_show_new_words, FALSE, "Display separate words"); +extern BOOL_VAR_H (textord_show_fixed_words, FALSE, +"Display forced fixed pitch words"); +extern BOOL_VAR_H (textord_blocksall_fixed, FALSE, "Moan about prop blocks"); +extern BOOL_VAR_H (textord_blocksall_prop, FALSE, +"Moan about fixed pitch blocks"); +extern BOOL_VAR_H (textord_blocksall_testing, FALSE, +"Dump stats when moaning"); +extern BOOL_VAR_H (textord_test_mode, FALSE, "Do current test"); +extern INT_VAR_H (textord_dotmatrix_gap, 3, +"Max pixel gap for broken pixed pitch"); +extern INT_VAR_H (textord_debug_block, 0, "Block to do debug on"); +extern INT_VAR_H (textord_pitch_range, 2, "Max range test on pitch"); +extern double_VAR_H (textord_wordstats_smooth_factor, 0.05, +"Smoothing gap stats"); +extern double_VAR_H (textord_width_smooth_factor, 0.10, +"Smoothing width stats"); +extern double_VAR_H (textord_words_width_ile, 0.4, +"Ile of blob widths for space est"); +extern double_VAR_H (textord_words_maxspace, 4.0, "Multiple of xheight"); +extern double_VAR_H (textord_words_default_maxspace, 3.5, +"Max believable third space"); +extern double_VAR_H (textord_words_default_minspace, 0.6, +"Fraction of xheight"); +extern double_VAR_H (textord_words_min_minspace, 0.3, "Fraction of xheight"); +extern double_VAR_H (textord_words_default_nonspace, 0.2, +"Fraction of xheight"); +extern double_VAR_H(textord_words_initial_lower, 0.25, + "Max initial cluster size"); +extern double_VAR_H (textord_words_initial_upper, 0.15, +"Min initial cluster spacing"); +extern double_VAR_H (textord_words_minlarge, 0.75, +"Fraction of valid gaps needed"); +extern double_VAR_H (textord_words_pitchsd_threshold, 0.025, +"Pitch sync threshold"); +extern double_VAR_H (textord_words_def_fixed, 0.01, +"Threshold for definite fixed"); +extern double_VAR_H (textord_words_def_prop, 0.06, +"Threshold for definite prop"); +extern INT_VAR_H (textord_words_veto_power, 5, +"Rows required to outvote a veto"); +extern double_VAR_H (textord_pitch_rowsimilarity, 0.08, +"Fraction of xheight for sameness"); +extern BOOL_VAR_H (textord_pitch_scalebigwords, FALSE, +"Scale scores on big words"); +extern double_VAR_H(words_initial_lower, 0.5, "Max initial cluster size"); +extern double_VAR_H (words_initial_upper, 0.15, +"Min initial cluster spacing"); +extern double_VAR_H (words_default_prop_nonspace, 0.25, +"Fraction of xheight"); +extern double_VAR_H (words_default_fixed_space, 0.75, "Fraction of xheight"); +extern double_VAR_H (words_default_fixed_limit, 0.6, "Allowed size variance"); +extern double_VAR_H (textord_words_definite_spread, 0.30, +"Non-fuzzy spacing region"); +extern double_VAR_H (textord_spacesize_ratiofp, 2.8, +"Min ratio space/nonspace"); +extern double_VAR_H (textord_spacesize_ratioprop, 2.0, +"Min ratio space/nonspace"); +extern double_VAR_H (textord_fpiqr_ratio, 1.5, "Pitch IQR/Gap IQR threshold"); +extern double_VAR_H (textord_max_pitch_iqr, 0.20, +"Xh fraction noise in pitch"); +extern double_VAR_H (textord_fp_min_width, 0.5, "Min width of decent blobs"); +#endif diff --git a/src/textord/underlin.h b/src/textord/underlin.h index 42c426ca11..c3b4b47a43 100644 --- a/src/textord/underlin.h +++ b/src/textord/underlin.h @@ -1,52 +1,52 @@ -/********************************************************************** - * File: underlin.h (Formerly undrline.h) - * Description: Code to chop blobs apart from underlines. - * Author: Ray Smith - * Created: Mon Aug 8 11:14:00 BST 1994 - * - * (C) Copyright 1994, Hewlett-Packard Ltd. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -#ifndef UNDERLIN_H -#define UNDERLIN_H - -#include "fpchop.h" - -extern double_VAR_H (textord_underline_offset, 0.1, -"Fraction of x to ignore"); -extern BOOL_VAR_H (textord_restore_underlines, FALSE, -"Chop underlines & put back"); -void restore_underlined_blobs( //get chop points - TO_BLOCK *block //block to do - ); -TO_ROW *most_overlapping_row( //find best row - TO_ROW_LIST *rows, //list of rows - BLOBNBOX *blob //blob to place - ); -void find_underlined_blobs( //get chop points - BLOBNBOX *u_line, //underlined unit - QSPLINE *baseline, //actual baseline - float xheight, //height of line - float baseline_offset, //amount to shrinke it - ICOORDELT_LIST *chop_cells //places to chop - ); -void vertical_cunderline_projection( //project outlines - C_OUTLINE *outline, //outline to project - QSPLINE *baseline, //actual baseline - float xheight, //height of line - float baseline_offset, //amount to shrinke it - STATS *lower_proj, //below baseline - STATS *middle_proj, //centre region - STATS *upper_proj //top region - ); -#endif +/********************************************************************** + * File: underlin.h (Formerly undrline.h) + * Description: Code to chop blobs apart from underlines. + * Author: Ray Smith + * Created: Mon Aug 8 11:14:00 BST 1994 + * + * (C) Copyright 1994, Hewlett-Packard Ltd. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +#ifndef UNDERLIN_H +#define UNDERLIN_H + +#include "fpchop.h" + +extern double_VAR_H (textord_underline_offset, 0.1, +"Fraction of x to ignore"); +extern BOOL_VAR_H (textord_restore_underlines, FALSE, +"Chop underlines & put back"); +void restore_underlined_blobs( //get chop points + TO_BLOCK *block //block to do + ); +TO_ROW *most_overlapping_row( //find best row + TO_ROW_LIST *rows, //list of rows + BLOBNBOX *blob //blob to place + ); +void find_underlined_blobs( //get chop points + BLOBNBOX *u_line, //underlined unit + QSPLINE *baseline, //actual baseline + float xheight, //height of line + float baseline_offset, //amount to shrinke it + ICOORDELT_LIST *chop_cells //places to chop + ); +void vertical_cunderline_projection( //project outlines + C_OUTLINE *outline, //outline to project + QSPLINE *baseline, //actual baseline + float xheight, //height of line + float baseline_offset, //amount to shrinke it + STATS *lower_proj, //below baseline + STATS *middle_proj, //centre region + STATS *upper_proj //top region + ); +#endif diff --git a/src/training/degradeimage.cpp b/src/training/degradeimage.cpp index d0b4b77d01..76f6cf092a 100644 --- a/src/training/degradeimage.cpp +++ b/src/training/degradeimage.cpp @@ -1,310 +1,310 @@ -/********************************************************************** - * File: degradeimage.cpp - * Description: Function to degrade an image (usually of text) as if it - * has been printed and then scanned. - * Authors: Ray Smith - * Created: Tue Nov 19 2013 - * - * (C) Copyright 2013, Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - **********************************************************************/ - -#include "degradeimage.h" - -#include -#include "allheaders.h" // from leptonica -#include "genericvector.h" -#include "helpers.h" // For TRand. -#include "rect.h" - -namespace tesseract { - -// A randomized perspective distortion can be applied to synthetic input. -// The perspective distortion comes from leptonica, which uses 2 sets of 4 -// corners to determine the distortion. There are random values for each of -// the x numbers x0..x3 and y0..y3, except for x2 and x3 which are instead -// defined in terms of a single shear value. This reduces the degrees of -// freedom enough to make the distortion more realistic than it would otherwise -// be if all 8 coordinates could move independently. -// One additional factor is used for the color of the pixels that don't exist -// in the source image. -// Name for each of the randomizing factors. -enum FactorNames { - FN_INCOLOR, - FN_Y0, - FN_Y1, - FN_Y2, - FN_Y3, - FN_X0, - FN_X1, - FN_SHEAR, - // x2 = x1 - shear - // x3 = x0 + shear - FN_NUM_FACTORS -}; - -// Rotation is +/- kRotationRange radians. -const float kRotationRange = 0.02f; -// Number of grey levels to shift by for each exposure step. -const int kExposureFactor = 16; -// Salt and pepper noise is +/- kSaltnPepper. -const int kSaltnPepper = 5; -// Min sum of width + height on which to operate the ramp. -const int kMinRampSize = 1000; - -// Degrade the pix as if by a print/copy/scan cycle with exposure > 0 -// corresponding to darkening on the copier and <0 lighter and 0 not copied. -// Exposures in [-2,2] are most useful, with -3 and 3 being extreme. -// If rotation is nullptr, rotation is skipped. If *rotation is non-zero, the -// pix is rotated by *rotation else it is randomly rotated and *rotation is -// modified. -// -// HOW IT WORKS: -// Most of the process is really dictated by the fact that the minimum -// available convolution is 3X3, which is too big really to simulate a -// good quality print/scan process. (2X2 would be better.) -// 1 pixel wide inputs are heavily smeared by the 3X3 convolution, making the -// images generally biased to being too light, so most of the work is to make -// them darker. 3 levels of thickening/darkening are achieved with 2 dilations, -// (using a greyscale erosion) one heavy (by being before convolution) and one -// light (after convolution). -// With no dilation, after covolution, the images are so light that a heavy -// constant offset is required to make the 0 image look reasonable. A simple -// constant offset multiple of exposure to undo this value is enough to achieve -// all the required lightening. This gives the advantage that exposure level 1 -// with a single dilation gives a good impression of the broken-yet-too-dark -// problem that is often seen in scans. -// A small random rotation gives some varying greyscale values on the edges, -// and some random salt and pepper noise on top helps to realistically jaggy-up -// the edges. -// Finally a greyscale ramp provides a continuum of effects between exposure -// levels. -Pix* DegradeImage(Pix* input, int exposure, TRand* randomizer, - float* rotation) { - Pix* pix = pixConvertTo8(input, false); - pixDestroy(&input); - input = pix; - int width = pixGetWidth(input); - int height = pixGetHeight(input); - if (exposure >= 2) { - // An erosion simulates the spreading darkening of a dark copy. - // This is backwards to binary morphology, - // see http://www.leptonica.com/grayscale-morphology.html - pix = input; - input = pixErodeGray(pix, 3, 3); - pixDestroy(&pix); - } - // A convolution is essential to any mode as no scanner produces an - // image as sharp as the electronic image. - pix = pixBlockconv(input, 1, 1); - pixDestroy(&input); - // A small random rotation helps to make the edges jaggy in a realistic way. - if (rotation != nullptr) { - float radians_clockwise = 0.0f; - if (*rotation) { - radians_clockwise = *rotation; - } else if (randomizer != nullptr) { - radians_clockwise = randomizer->SignedRand(kRotationRange); - } - - input = pixRotate(pix, radians_clockwise, - L_ROTATE_AREA_MAP, L_BRING_IN_WHITE, - 0, 0); - // Rotate the boxes to match. - *rotation = radians_clockwise; - pixDestroy(&pix); - } else { - input = pix; - } - - if (exposure >= 3 || exposure == 1) { - // Erosion after the convolution is not as heavy as before, so it is - // good for level 1 and in addition as a level 3. - // This is backwards to binary morphology, - // see http://www.leptonica.com/grayscale-morphology.html - pix = input; - input = pixErodeGray(pix, 3, 3); - pixDestroy(&pix); - } - // The convolution really needed to be 2x2 to be realistic enough, but - // we only have 3x3, so we have to bias the image darker or lose thin - // strokes. - int erosion_offset = 0; - // For light and 0 exposure, there is no dilation, so compensate for the - // convolution with a big darkening bias which is undone for lighter - // exposures. - if (exposure <= 0) - erosion_offset = -3 * kExposureFactor; - // Add in a general offset of the greyscales for the exposure level so - // a threshold of 128 gives a reasonable binary result. - erosion_offset -= exposure * kExposureFactor; - // Add a gradual fade over the page and a small amount of salt and pepper - // noise to simulate noise in the sensor/paper fibres and varying - // illumination. - l_uint32* data = pixGetData(input); - for (int y = 0; y < height; ++y) { - for (int x = 0; x < width; ++x) { - int pixel = GET_DATA_BYTE(data, x); - if (randomizer != nullptr) - pixel += randomizer->IntRand() % (kSaltnPepper*2 + 1) - kSaltnPepper; - if (height + width > kMinRampSize) - pixel -= (2*x + y) * 32 / (height + width); - pixel += erosion_offset; - if (pixel < 0) - pixel = 0; - if (pixel > 255) - pixel = 255; - SET_DATA_BYTE(data, x, pixel); - } - data += input->wpl; - } - return input; -} - -// Creates and returns a Pix distorted by various means according to the bool -// flags. If boxes is not nullptr, the boxes are resized/positioned according to -// any spatial distortion and also by the integer reduction factor box_scale -// so they will match what the network will output. -// Returns nullptr on error. The returned Pix must be pixDestroyed. -Pix* PrepareDistortedPix(const Pix* pix, bool perspective, bool invert, - bool white_noise, bool smooth_noise, bool blur, - int box_reduction, TRand* randomizer, - GenericVector* boxes) { - Pix* distorted = pixCopy(nullptr, const_cast(pix)); - // Things to do to synthetic training data. - if (invert && randomizer->SignedRand(1.0) < 0) - pixInvert(distorted, distorted); - if ((white_noise || smooth_noise) && randomizer->SignedRand(1.0) > 0.0) { - // TODO(rays) Cook noise in a more thread-safe manner than rand(). - // Attempt to make the sequences reproducible. - srand(randomizer->IntRand()); - Pix* pixn = pixAddGaussianNoise(distorted, 8.0); - pixDestroy(&distorted); - if (smooth_noise) { - distorted = pixBlockconv(pixn, 1, 1); - pixDestroy(&pixn); - } else { - distorted = pixn; - } - } - if (blur && randomizer->SignedRand(1.0) > 0.0) { - Pix* blurred = pixBlockconv(distorted, 1, 1); - pixDestroy(&distorted); - distorted = blurred; - } - if (perspective) - GeneratePerspectiveDistortion(0, 0, randomizer, &distorted, boxes); - if (boxes != nullptr) { - for (int b = 0; b < boxes->size(); ++b) { - (*boxes)[b].scale(1.0f / box_reduction); - if ((*boxes)[b].width() <= 0) - (*boxes)[b].set_right((*boxes)[b].left() + 1); - } - } - return distorted; -} - -// Distorts anything that has a non-null pointer with the same pseudo-random -// perspective distortion. Width and height only need to be set if there -// is no pix. If there is a pix, then they will be taken from there. -void GeneratePerspectiveDistortion(int width, int height, TRand* randomizer, - Pix** pix, GenericVector* boxes) { - if (pix != nullptr && *pix != nullptr) { - width = pixGetWidth(*pix); - height = pixGetHeight(*pix); - } - float* im_coeffs = nullptr; - float* box_coeffs = nullptr; - l_int32 incolor = - ProjectiveCoeffs(width, height, randomizer, &im_coeffs, &box_coeffs); - if (pix != nullptr && *pix != nullptr) { - // Transform the image. - Pix* transformed = pixProjective(*pix, im_coeffs, incolor); - if (transformed == nullptr) { - tprintf("Projective transformation failed!!\n"); - return; - } - pixDestroy(pix); - *pix = transformed; - } - if (boxes != nullptr) { - // Transform the boxes. - for (int b = 0; b < boxes->size(); ++b) { - int x1, y1, x2, y2; - const TBOX& box = (*boxes)[b]; - projectiveXformSampledPt(box_coeffs, box.left(), height - box.top(), &x1, - &y1); - projectiveXformSampledPt(box_coeffs, box.right(), height - box.bottom(), - &x2, &y2); - TBOX new_box1(x1, height - y2, x2, height - y1); - projectiveXformSampledPt(box_coeffs, box.left(), height - box.bottom(), - &x1, &y1); - projectiveXformSampledPt(box_coeffs, box.right(), height - box.top(), &x2, - &y2); - TBOX new_box2(x1, height - y1, x2, height - y2); - (*boxes)[b] = new_box1.bounding_union(new_box2); - } - } - free(im_coeffs); - free(box_coeffs); -} - -// Computes the coefficients of a randomized projective transformation. -// The image transform requires backward transformation coefficient, and the -// box transform the forward coefficients. -// Returns the incolor arg to pixProjective. -int ProjectiveCoeffs(int width, int height, TRand* randomizer, - float** im_coeffs, float** box_coeffs) { - // Setup "from" points. - Pta* src_pts = ptaCreate(4); - ptaAddPt(src_pts, 0.0f, 0.0f); - ptaAddPt(src_pts, width, 0.0f); - ptaAddPt(src_pts, width, height); - ptaAddPt(src_pts, 0.0f, height); - // Extract factors from pseudo-random sequence. - float factors[FN_NUM_FACTORS]; - float shear = 0.0f; // Shear is signed. - for (int i = 0; i < FN_NUM_FACTORS; ++i) { - // Everything is squared to make wild values rarer. - if (i == FN_SHEAR) { - // Shear is signed. - shear = randomizer->SignedRand(0.5 / 3.0); - shear = shear >= 0.0 ? shear * shear : -shear * shear; - // Keep the sheared points within the original rectangle. - if (shear < -factors[FN_X0]) shear = -factors[FN_X0]; - if (shear > factors[FN_X1]) shear = factors[FN_X1]; - factors[i] = shear; - } else if (i != FN_INCOLOR) { - factors[i] = fabs(randomizer->SignedRand(1.0)); - if (i <= FN_Y3) - factors[i] *= 5.0 / 8.0; - else - factors[i] *= 0.5; - factors[i] *= factors[i]; - } - } - // Setup "to" points. - Pta* dest_pts = ptaCreate(4); - ptaAddPt(dest_pts, factors[FN_X0] * width, factors[FN_Y0] * height); - ptaAddPt(dest_pts, (1.0f - factors[FN_X1]) * width, factors[FN_Y1] * height); - ptaAddPt(dest_pts, (1.0f - factors[FN_X1] + shear) * width, - (1 - factors[FN_Y2]) * height); - ptaAddPt(dest_pts, (factors[FN_X0] + shear) * width, - (1 - factors[FN_Y3]) * height); - getProjectiveXformCoeffs(dest_pts, src_pts, im_coeffs); - getProjectiveXformCoeffs(src_pts, dest_pts, box_coeffs); - ptaDestroy(&src_pts); - ptaDestroy(&dest_pts); - return factors[FN_INCOLOR] > 0.5f ? L_BRING_IN_WHITE : L_BRING_IN_BLACK; -} - -} // namespace tesseract +/********************************************************************** + * File: degradeimage.cpp + * Description: Function to degrade an image (usually of text) as if it + * has been printed and then scanned. + * Authors: Ray Smith + * Created: Tue Nov 19 2013 + * + * (C) Copyright 2013, Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + **********************************************************************/ + +#include "degradeimage.h" + +#include +#include "allheaders.h" // from leptonica +#include "genericvector.h" +#include "helpers.h" // For TRand. +#include "rect.h" + +namespace tesseract { + +// A randomized perspective distortion can be applied to synthetic input. +// The perspective distortion comes from leptonica, which uses 2 sets of 4 +// corners to determine the distortion. There are random values for each of +// the x numbers x0..x3 and y0..y3, except for x2 and x3 which are instead +// defined in terms of a single shear value. This reduces the degrees of +// freedom enough to make the distortion more realistic than it would otherwise +// be if all 8 coordinates could move independently. +// One additional factor is used for the color of the pixels that don't exist +// in the source image. +// Name for each of the randomizing factors. +enum FactorNames { + FN_INCOLOR, + FN_Y0, + FN_Y1, + FN_Y2, + FN_Y3, + FN_X0, + FN_X1, + FN_SHEAR, + // x2 = x1 - shear + // x3 = x0 + shear + FN_NUM_FACTORS +}; + +// Rotation is +/- kRotationRange radians. +const float kRotationRange = 0.02f; +// Number of grey levels to shift by for each exposure step. +const int kExposureFactor = 16; +// Salt and pepper noise is +/- kSaltnPepper. +const int kSaltnPepper = 5; +// Min sum of width + height on which to operate the ramp. +const int kMinRampSize = 1000; + +// Degrade the pix as if by a print/copy/scan cycle with exposure > 0 +// corresponding to darkening on the copier and <0 lighter and 0 not copied. +// Exposures in [-2,2] are most useful, with -3 and 3 being extreme. +// If rotation is nullptr, rotation is skipped. If *rotation is non-zero, the +// pix is rotated by *rotation else it is randomly rotated and *rotation is +// modified. +// +// HOW IT WORKS: +// Most of the process is really dictated by the fact that the minimum +// available convolution is 3X3, which is too big really to simulate a +// good quality print/scan process. (2X2 would be better.) +// 1 pixel wide inputs are heavily smeared by the 3X3 convolution, making the +// images generally biased to being too light, so most of the work is to make +// them darker. 3 levels of thickening/darkening are achieved with 2 dilations, +// (using a greyscale erosion) one heavy (by being before convolution) and one +// light (after convolution). +// With no dilation, after covolution, the images are so light that a heavy +// constant offset is required to make the 0 image look reasonable. A simple +// constant offset multiple of exposure to undo this value is enough to achieve +// all the required lightening. This gives the advantage that exposure level 1 +// with a single dilation gives a good impression of the broken-yet-too-dark +// problem that is often seen in scans. +// A small random rotation gives some varying greyscale values on the edges, +// and some random salt and pepper noise on top helps to realistically jaggy-up +// the edges. +// Finally a greyscale ramp provides a continuum of effects between exposure +// levels. +Pix* DegradeImage(Pix* input, int exposure, TRand* randomizer, + float* rotation) { + Pix* pix = pixConvertTo8(input, false); + pixDestroy(&input); + input = pix; + int width = pixGetWidth(input); + int height = pixGetHeight(input); + if (exposure >= 2) { + // An erosion simulates the spreading darkening of a dark copy. + // This is backwards to binary morphology, + // see http://www.leptonica.com/grayscale-morphology.html + pix = input; + input = pixErodeGray(pix, 3, 3); + pixDestroy(&pix); + } + // A convolution is essential to any mode as no scanner produces an + // image as sharp as the electronic image. + pix = pixBlockconv(input, 1, 1); + pixDestroy(&input); + // A small random rotation helps to make the edges jaggy in a realistic way. + if (rotation != nullptr) { + float radians_clockwise = 0.0f; + if (*rotation) { + radians_clockwise = *rotation; + } else if (randomizer != nullptr) { + radians_clockwise = randomizer->SignedRand(kRotationRange); + } + + input = pixRotate(pix, radians_clockwise, + L_ROTATE_AREA_MAP, L_BRING_IN_WHITE, + 0, 0); + // Rotate the boxes to match. + *rotation = radians_clockwise; + pixDestroy(&pix); + } else { + input = pix; + } + + if (exposure >= 3 || exposure == 1) { + // Erosion after the convolution is not as heavy as before, so it is + // good for level 1 and in addition as a level 3. + // This is backwards to binary morphology, + // see http://www.leptonica.com/grayscale-morphology.html + pix = input; + input = pixErodeGray(pix, 3, 3); + pixDestroy(&pix); + } + // The convolution really needed to be 2x2 to be realistic enough, but + // we only have 3x3, so we have to bias the image darker or lose thin + // strokes. + int erosion_offset = 0; + // For light and 0 exposure, there is no dilation, so compensate for the + // convolution with a big darkening bias which is undone for lighter + // exposures. + if (exposure <= 0) + erosion_offset = -3 * kExposureFactor; + // Add in a general offset of the greyscales for the exposure level so + // a threshold of 128 gives a reasonable binary result. + erosion_offset -= exposure * kExposureFactor; + // Add a gradual fade over the page and a small amount of salt and pepper + // noise to simulate noise in the sensor/paper fibres and varying + // illumination. + l_uint32* data = pixGetData(input); + for (int y = 0; y < height; ++y) { + for (int x = 0; x < width; ++x) { + int pixel = GET_DATA_BYTE(data, x); + if (randomizer != nullptr) + pixel += randomizer->IntRand() % (kSaltnPepper*2 + 1) - kSaltnPepper; + if (height + width > kMinRampSize) + pixel -= (2*x + y) * 32 / (height + width); + pixel += erosion_offset; + if (pixel < 0) + pixel = 0; + if (pixel > 255) + pixel = 255; + SET_DATA_BYTE(data, x, pixel); + } + data += input->wpl; + } + return input; +} + +// Creates and returns a Pix distorted by various means according to the bool +// flags. If boxes is not nullptr, the boxes are resized/positioned according to +// any spatial distortion and also by the integer reduction factor box_scale +// so they will match what the network will output. +// Returns nullptr on error. The returned Pix must be pixDestroyed. +Pix* PrepareDistortedPix(const Pix* pix, bool perspective, bool invert, + bool white_noise, bool smooth_noise, bool blur, + int box_reduction, TRand* randomizer, + GenericVector* boxes) { + Pix* distorted = pixCopy(nullptr, const_cast(pix)); + // Things to do to synthetic training data. + if (invert && randomizer->SignedRand(1.0) < 0) + pixInvert(distorted, distorted); + if ((white_noise || smooth_noise) && randomizer->SignedRand(1.0) > 0.0) { + // TODO(rays) Cook noise in a more thread-safe manner than rand(). + // Attempt to make the sequences reproducible. + srand(randomizer->IntRand()); + Pix* pixn = pixAddGaussianNoise(distorted, 8.0); + pixDestroy(&distorted); + if (smooth_noise) { + distorted = pixBlockconv(pixn, 1, 1); + pixDestroy(&pixn); + } else { + distorted = pixn; + } + } + if (blur && randomizer->SignedRand(1.0) > 0.0) { + Pix* blurred = pixBlockconv(distorted, 1, 1); + pixDestroy(&distorted); + distorted = blurred; + } + if (perspective) + GeneratePerspectiveDistortion(0, 0, randomizer, &distorted, boxes); + if (boxes != nullptr) { + for (int b = 0; b < boxes->size(); ++b) { + (*boxes)[b].scale(1.0f / box_reduction); + if ((*boxes)[b].width() <= 0) + (*boxes)[b].set_right((*boxes)[b].left() + 1); + } + } + return distorted; +} + +// Distorts anything that has a non-null pointer with the same pseudo-random +// perspective distortion. Width and height only need to be set if there +// is no pix. If there is a pix, then they will be taken from there. +void GeneratePerspectiveDistortion(int width, int height, TRand* randomizer, + Pix** pix, GenericVector* boxes) { + if (pix != nullptr && *pix != nullptr) { + width = pixGetWidth(*pix); + height = pixGetHeight(*pix); + } + float* im_coeffs = nullptr; + float* box_coeffs = nullptr; + l_int32 incolor = + ProjectiveCoeffs(width, height, randomizer, &im_coeffs, &box_coeffs); + if (pix != nullptr && *pix != nullptr) { + // Transform the image. + Pix* transformed = pixProjective(*pix, im_coeffs, incolor); + if (transformed == nullptr) { + tprintf("Projective transformation failed!!\n"); + return; + } + pixDestroy(pix); + *pix = transformed; + } + if (boxes != nullptr) { + // Transform the boxes. + for (int b = 0; b < boxes->size(); ++b) { + int x1, y1, x2, y2; + const TBOX& box = (*boxes)[b]; + projectiveXformSampledPt(box_coeffs, box.left(), height - box.top(), &x1, + &y1); + projectiveXformSampledPt(box_coeffs, box.right(), height - box.bottom(), + &x2, &y2); + TBOX new_box1(x1, height - y2, x2, height - y1); + projectiveXformSampledPt(box_coeffs, box.left(), height - box.bottom(), + &x1, &y1); + projectiveXformSampledPt(box_coeffs, box.right(), height - box.top(), &x2, + &y2); + TBOX new_box2(x1, height - y1, x2, height - y2); + (*boxes)[b] = new_box1.bounding_union(new_box2); + } + } + free(im_coeffs); + free(box_coeffs); +} + +// Computes the coefficients of a randomized projective transformation. +// The image transform requires backward transformation coefficient, and the +// box transform the forward coefficients. +// Returns the incolor arg to pixProjective. +int ProjectiveCoeffs(int width, int height, TRand* randomizer, + float** im_coeffs, float** box_coeffs) { + // Setup "from" points. + Pta* src_pts = ptaCreate(4); + ptaAddPt(src_pts, 0.0f, 0.0f); + ptaAddPt(src_pts, width, 0.0f); + ptaAddPt(src_pts, width, height); + ptaAddPt(src_pts, 0.0f, height); + // Extract factors from pseudo-random sequence. + float factors[FN_NUM_FACTORS]; + float shear = 0.0f; // Shear is signed. + for (int i = 0; i < FN_NUM_FACTORS; ++i) { + // Everything is squared to make wild values rarer. + if (i == FN_SHEAR) { + // Shear is signed. + shear = randomizer->SignedRand(0.5 / 3.0); + shear = shear >= 0.0 ? shear * shear : -shear * shear; + // Keep the sheared points within the original rectangle. + if (shear < -factors[FN_X0]) shear = -factors[FN_X0]; + if (shear > factors[FN_X1]) shear = factors[FN_X1]; + factors[i] = shear; + } else if (i != FN_INCOLOR) { + factors[i] = fabs(randomizer->SignedRand(1.0)); + if (i <= FN_Y3) + factors[i] *= 5.0 / 8.0; + else + factors[i] *= 0.5; + factors[i] *= factors[i]; + } + } + // Setup "to" points. + Pta* dest_pts = ptaCreate(4); + ptaAddPt(dest_pts, factors[FN_X0] * width, factors[FN_Y0] * height); + ptaAddPt(dest_pts, (1.0f - factors[FN_X1]) * width, factors[FN_Y1] * height); + ptaAddPt(dest_pts, (1.0f - factors[FN_X1] + shear) * width, + (1 - factors[FN_Y2]) * height); + ptaAddPt(dest_pts, (factors[FN_X0] + shear) * width, + (1 - factors[FN_Y3]) * height); + getProjectiveXformCoeffs(dest_pts, src_pts, im_coeffs); + getProjectiveXformCoeffs(src_pts, dest_pts, box_coeffs); + ptaDestroy(&src_pts); + ptaDestroy(&dest_pts); + return factors[FN_INCOLOR] > 0.5f ? L_BRING_IN_WHITE : L_BRING_IN_BLACK; +} + +} // namespace tesseract diff --git a/src/training/degradeimage.h b/src/training/degradeimage.h index 98ef764f87..85e35f0ad2 100644 --- a/src/training/degradeimage.h +++ b/src/training/degradeimage.h @@ -1,61 +1,61 @@ -/********************************************************************** - * File: degradeimage.h - * Description: Function to degrade an image (usually of text) as if it - * has been printed and then scanned. - * Authors: Ray Smith - * Created: Tue Nov 19 2013 - * - * (C) Copyright 2013, Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - **********************************************************************/ -#ifndef TESSERACT_TRAINING_DEGRADEIMAGE_H_ -#define TESSERACT_TRAINING_DEGRADEIMAGE_H_ - -#include "allheaders.h" -#include "genericvector.h" -#include "helpers.h" // For TRand. -#include "rect.h" - -namespace tesseract { - -// Degrade the pix as if by a print/copy/scan cycle with exposure > 0 -// corresponding to darkening on the copier and <0 lighter and 0 not copied. -// If rotation is not nullptr, the clockwise rotation in radians is saved there. -// The input pix must be 8 bit grey. (Binary with values 0 and 255 is OK.) -// The input image is destroyed and a different image returned. -struct Pix* DegradeImage(struct Pix* input, int exposure, TRand* randomizer, - float* rotation); - -// Creates and returns a Pix distorted by various means according to the bool -// flags. If boxes is not nullptr, the boxes are resized/positioned according to -// any spatial distortion and also by the integer reduction factor box_scale -// so they will match what the network will output. -// Returns nullptr on error. The returned Pix must be pixDestroyed. -Pix* PrepareDistortedPix(const Pix* pix, bool perspective, bool invert, - bool white_noise, bool smooth_noise, bool blur, - int box_reduction, TRand* randomizer, - GenericVector* boxes); -// Distorts anything that has a non-null pointer with the same pseudo-random -// perspective distortion. Width and height only need to be set if there -// is no pix. If there is a pix, then they will be taken from there. -void GeneratePerspectiveDistortion(int width, int height, TRand* randomizer, - Pix** pix, GenericVector* boxes); -// Computes the coefficients of a randomized projective transformation. -// The image transform requires backward transformation coefficient, and the -// box transform the forward coefficients. -// Returns the incolor arg to pixProjective. -int ProjectiveCoeffs(int width, int height, TRand* randomizer, - float** im_coeffs, float** box_coeffs); - -} // namespace tesseract - -#endif // TESSERACT_TRAINING_DEGRADEIMAGE_H_ +/********************************************************************** + * File: degradeimage.h + * Description: Function to degrade an image (usually of text) as if it + * has been printed and then scanned. + * Authors: Ray Smith + * Created: Tue Nov 19 2013 + * + * (C) Copyright 2013, Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + **********************************************************************/ +#ifndef TESSERACT_TRAINING_DEGRADEIMAGE_H_ +#define TESSERACT_TRAINING_DEGRADEIMAGE_H_ + +#include "allheaders.h" +#include "genericvector.h" +#include "helpers.h" // For TRand. +#include "rect.h" + +namespace tesseract { + +// Degrade the pix as if by a print/copy/scan cycle with exposure > 0 +// corresponding to darkening on the copier and <0 lighter and 0 not copied. +// If rotation is not nullptr, the clockwise rotation in radians is saved there. +// The input pix must be 8 bit grey. (Binary with values 0 and 255 is OK.) +// The input image is destroyed and a different image returned. +struct Pix* DegradeImage(struct Pix* input, int exposure, TRand* randomizer, + float* rotation); + +// Creates and returns a Pix distorted by various means according to the bool +// flags. If boxes is not nullptr, the boxes are resized/positioned according to +// any spatial distortion and also by the integer reduction factor box_scale +// so they will match what the network will output. +// Returns nullptr on error. The returned Pix must be pixDestroyed. +Pix* PrepareDistortedPix(const Pix* pix, bool perspective, bool invert, + bool white_noise, bool smooth_noise, bool blur, + int box_reduction, TRand* randomizer, + GenericVector* boxes); +// Distorts anything that has a non-null pointer with the same pseudo-random +// perspective distortion. Width and height only need to be set if there +// is no pix. If there is a pix, then they will be taken from there. +void GeneratePerspectiveDistortion(int width, int height, TRand* randomizer, + Pix** pix, GenericVector* boxes); +// Computes the coefficients of a randomized projective transformation. +// The image transform requires backward transformation coefficient, and the +// box transform the forward coefficients. +// Returns the incolor arg to pixProjective. +int ProjectiveCoeffs(int width, int height, TRand* randomizer, + float** im_coeffs, float** box_coeffs); + +} // namespace tesseract + +#endif // TESSERACT_TRAINING_DEGRADEIMAGE_H_ diff --git a/src/training/icuerrorcode.h b/src/training/icuerrorcode.h index 0a1b4ec5dd..a606415f04 100644 --- a/src/training/icuerrorcode.h +++ b/src/training/icuerrorcode.h @@ -1,66 +1,66 @@ -/********************************************************************** - * File: icuerrorcode.h - * Description: Wrapper class for UErrorCode, with conversion operators for - * direct use in ICU C and C++ APIs. - * Author: Fredrik Roubert - * Created: Thu July 4 2013 - * - * Features: - * - The constructor initializes the internal UErrorCode to U_ZERO_ERROR, - * removing one common source of errors. - * - Same use in C APIs taking a UErrorCode* (pointer) and C++ taking - * UErrorCode& (reference), via conversion operators. - * - Automatic checking for success when it goes out of scope. On failure, - * the destructor will log an error message and exit. - * - * Most of ICU will handle errors gracefully and provide sensible fallbacks. - * Using IcuErrorCode, it is therefore possible to write very compact code - * that does sensible things on failure and provides logging for debugging. - * - * Example: - * IcuErrorCode icuerrorcode; - * return collator.compareUTF8(a, b, icuerrorcode) == UCOL_EQUAL; - * - * (C) Copyright 2013, Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - **********************************************************************/ -#ifndef TESSERACT_CCUTIL_ICUERRORCODE_H_ -#define TESSERACT_CCUTIL_ICUERRORCODE_H_ - -#include "tprintf.h" -#include "unicode/errorcode.h" // From libicu - -namespace tesseract { - -class IcuErrorCode : public icu::ErrorCode { - public: - IcuErrorCode() {} - virtual ~IcuErrorCode() { - if (isFailure()) { - handleFailure(); - } - } - - protected: - virtual void handleFailure() const { - tprintf("ICU ERROR: %s", errorName()); - exit(errorCode); - } - - private: - // Disallow implicit copying of object. - IcuErrorCode(const IcuErrorCode&); - void operator=(const IcuErrorCode&); -}; - -} // namespace tesseract -#endif // TESSERACT_CCUTIL_ICUERRORCODE_H_ +/********************************************************************** + * File: icuerrorcode.h + * Description: Wrapper class for UErrorCode, with conversion operators for + * direct use in ICU C and C++ APIs. + * Author: Fredrik Roubert + * Created: Thu July 4 2013 + * + * Features: + * - The constructor initializes the internal UErrorCode to U_ZERO_ERROR, + * removing one common source of errors. + * - Same use in C APIs taking a UErrorCode* (pointer) and C++ taking + * UErrorCode& (reference), via conversion operators. + * - Automatic checking for success when it goes out of scope. On failure, + * the destructor will log an error message and exit. + * + * Most of ICU will handle errors gracefully and provide sensible fallbacks. + * Using IcuErrorCode, it is therefore possible to write very compact code + * that does sensible things on failure and provides logging for debugging. + * + * Example: + * IcuErrorCode icuerrorcode; + * return collator.compareUTF8(a, b, icuerrorcode) == UCOL_EQUAL; + * + * (C) Copyright 2013, Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + **********************************************************************/ +#ifndef TESSERACT_CCUTIL_ICUERRORCODE_H_ +#define TESSERACT_CCUTIL_ICUERRORCODE_H_ + +#include "tprintf.h" +#include "unicode/errorcode.h" // From libicu + +namespace tesseract { + +class IcuErrorCode : public icu::ErrorCode { + public: + IcuErrorCode() {} + virtual ~IcuErrorCode() { + if (isFailure()) { + handleFailure(); + } + } + + protected: + virtual void handleFailure() const { + tprintf("ICU ERROR: %s", errorName()); + exit(errorCode); + } + + private: + // Disallow implicit copying of object. + IcuErrorCode(const IcuErrorCode&); + void operator=(const IcuErrorCode&); +}; + +} // namespace tesseract +#endif // TESSERACT_CCUTIL_ICUERRORCODE_H_ diff --git a/src/training/mergenf.cpp b/src/training/mergenf.cpp index d79a182434..4c8e7037d8 100644 --- a/src/training/mergenf.cpp +++ b/src/training/mergenf.cpp @@ -1,353 +1,353 @@ -/****************************************************************************** -** Filename: MergeNF.c -** Purpose: Program for merging similar nano-feature protos -** Author: Dan Johnson -** History: Wed Nov 21 09:55:23 1990, DSJ, Created. -** - ** (c) Copyright Hewlett-Packard Company, 1988. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. -******************************************************************************/ -#include "mergenf.h" -#include "host.h" -#include "efio.h" -#include "clusttool.h" -#include "cluster.h" -#include "oldlist.h" -#include "protos.h" -#include "ndminx.h" -#include "ocrfeatures.h" -#include "const.h" -#include "featdefs.h" -#include "intproto.h" -#include "params.h" - -#include -#include -#include - -/*-------------------once in subfeat---------------------------------*/ -double_VAR(training_angle_match_scale, 1.0, "Angle Match Scale ..."); - -double_VAR(training_similarity_midpoint, 0.0075, "Similarity Midpoint ..."); - -double_VAR(training_similarity_curl, 2.0, "Similarity Curl ..."); - -/*-----------------------------once in fasttrain----------------------------------*/ -double_VAR(training_tangent_bbox_pad, 0.5, "Tangent bounding box pad ..."); - -double_VAR(training_orthogonal_bbox_pad, 2.5, "Orthogonal bounding box pad ..."); - -double_VAR(training_angle_pad, 45.0, "Angle pad ..."); - -/** - * Compare protos p1 and p2 and return an estimate of the - * worst evidence rating that will result for any part of p1 - * that is compared to p2. In other words, if p1 were broken - * into pico-features and each pico-feature was matched to p2, - * what is the worst evidence rating that will be achieved for - * any pico-feature. - * - * @param p1, p2 protos to be compared - * - * Globals: none - * - * @return Worst possible result when matching p1 to p2. - * @note Exceptions: none - * @note History: Mon Nov 26 08:27:53 1990, DSJ, Created. - */ -FLOAT32 CompareProtos(PROTO p1, PROTO p2) { - FEATURE Feature; - FLOAT32 WorstEvidence = WORST_EVIDENCE; - FLOAT32 Evidence; - FLOAT32 Angle, Length; - - /* if p1 and p2 are not close in length, don't let them match */ - Length = fabs (p1->Length - p2->Length); - if (Length > MAX_LENGTH_MISMATCH) - return (0.0); - - /* create a dummy pico-feature to be used for comparisons */ - Feature = NewFeature (&PicoFeatDesc); - Feature->Params[PicoFeatDir] = p1->Angle; - - /* convert angle to radians */ - Angle = p1->Angle * 2.0 * PI; - - /* find distance from center of p1 to 1/2 picofeat from end */ - Length = p1->Length / 2.0 - GetPicoFeatureLength () / 2.0; - if (Length < 0) Length = 0; - - /* set the dummy pico-feature at one end of p1 and match it to p2 */ - Feature->Params[PicoFeatX] = p1->X + cos (Angle) * Length; - Feature->Params[PicoFeatY] = p1->Y + sin (Angle) * Length; - if (DummyFastMatch (Feature, p2)) { - Evidence = SubfeatureEvidence (Feature, p2); - if (Evidence < WorstEvidence) - WorstEvidence = Evidence; - } else { - FreeFeature(Feature); - return 0.0; - } - - /* set the dummy pico-feature at the other end of p1 and match it to p2 */ - Feature->Params[PicoFeatX] = p1->X - cos (Angle) * Length; - Feature->Params[PicoFeatY] = p1->Y - sin (Angle) * Length; - if (DummyFastMatch (Feature, p2)) { - Evidence = SubfeatureEvidence (Feature, p2); - if (Evidence < WorstEvidence) - WorstEvidence = Evidence; - } else { - FreeFeature(Feature); - return 0.0; - } - - FreeFeature (Feature); - return (WorstEvidence); - -} /* CompareProtos */ - -/** - * This routine computes a proto which is the weighted - * average of protos p1 and p2. The new proto is returned - * in MergedProto. - * - * @param p1, p2 protos to be merged - * @param w1, w2 weight of each proto - * @param MergedProto place to put resulting merged proto - * - * Globals: none - * - * @return none (results are returned in MergedProto) - * @note Exceptions: none - * @note History: Mon Nov 26 08:15:08 1990, DSJ, Created. - */ -void ComputeMergedProto (PROTO p1, - PROTO p2, - FLOAT32 w1, - FLOAT32 w2, - PROTO MergedProto) { - FLOAT32 TotalWeight; - - TotalWeight = w1 + w2; - w1 /= TotalWeight; - w2 /= TotalWeight; - - MergedProto->X = p1->X * w1 + p2->X * w2; - MergedProto->Y = p1->Y * w1 + p2->Y * w2; - MergedProto->Length = p1->Length * w1 + p2->Length * w2; - MergedProto->Angle = p1->Angle * w1 + p2->Angle * w2; - FillABC(MergedProto); -} /* ComputeMergedProto */ - -/** - * This routine searches through all of the prototypes in - * Class and returns the id of the proto which would provide - * the best approximation of Prototype. If no close - * approximation can be found, NO_PROTO is returned. - * - * @param Class class to search for matching old proto in - * @param NumMerged # of protos merged into each proto of Class - * @param Prototype new proto to find match for - * - * Globals: none - * - * @return Id of closest proto in Class or NO_PROTO. - * @note Exceptions: none - * @note History: Sat Nov 24 11:42:58 1990, DSJ, Created. - */ -int FindClosestExistingProto(CLASS_TYPE Class, int NumMerged[], - PROTOTYPE *Prototype) { - PROTO_STRUCT NewProto; - PROTO_STRUCT MergedProto; - int Pid; - PROTO Proto; - int BestProto; - FLOAT32 BestMatch; - FLOAT32 Match, OldMatch, NewMatch; - - MakeNewFromOld (&NewProto, Prototype); - - BestProto = NO_PROTO; - BestMatch = WORST_MATCH_ALLOWED; - for (Pid = 0; Pid < Class->NumProtos; Pid++) { - Proto = ProtoIn(Class, Pid); - ComputeMergedProto(Proto, &NewProto, - (FLOAT32) NumMerged[Pid], 1.0, &MergedProto); - OldMatch = CompareProtos(Proto, &MergedProto); - NewMatch = CompareProtos(&NewProto, &MergedProto); - Match = MIN(OldMatch, NewMatch); - if (Match > BestMatch) { - BestProto = Pid; - BestMatch = Match; - } - } - return BestProto; -} /* FindClosestExistingProto */ - -/** - * This fills in the fields of the New proto based on the - * fields of the Old proto. - * - * @param New new proto to be filled in - * @param Old old proto to be converted - * - * Globals: none - * - * Exceptions: none - * History: Mon Nov 26 09:45:39 1990, DSJ, Created. - */ -void MakeNewFromOld(PROTO New, PROTOTYPE *Old) { - New->X = CenterX(Old->Mean); - New->Y = CenterY(Old->Mean); - New->Length = LengthOf(Old->Mean); - New->Angle = OrientationOf(Old->Mean); - FillABC(New); -} /* MakeNewFromOld */ - -/*-------------------once in subfeat---------------------------------*/ - -/** - * @name SubfeatureEvidence - * - * Compare a feature to a prototype. Print the result. - */ -FLOAT32 SubfeatureEvidence(FEATURE Feature, PROTO Proto) { - float Distance; - float Dangle; - - Dangle = Proto->Angle - Feature->Params[PicoFeatDir]; - if (Dangle < -0.5) Dangle += 1.0; - if (Dangle > 0.5) Dangle -= 1.0; - Dangle *= training_angle_match_scale; - - Distance = Proto->A * Feature->Params[PicoFeatX] + - Proto->B * Feature->Params[PicoFeatY] + - Proto->C; - - return (EvidenceOf (Distance * Distance + Dangle * Dangle)); -} - -/** - * @name EvidenceOf - * - * Return the new type of evidence number corresponding to this - * distance value. This number is no longer based on the chi squared - * approximation. The equation that represents the transform is: - * 1 / (1 + (sim / midpoint) ^ curl) - */ -double EvidenceOf (double Similarity) { - - Similarity /= training_similarity_midpoint; - - if (training_similarity_curl == 3) - Similarity = Similarity * Similarity * Similarity; - else if (training_similarity_curl == 2) - Similarity = Similarity * Similarity; - else - Similarity = pow (Similarity, training_similarity_curl); - - return (1.0 / (1.0 + Similarity)); -} - -/** - * This routine returns TRUE if Feature would be matched - * by a fast match table built from Proto. - * - * @param Feature feature to be "fast matched" to proto - * @param Proto proto being "fast matched" against - * - * Globals: - * - training_tangent_bbox_pad bounding box pad tangent to proto - * - training_orthogonal_bbox_pad bounding box pad orthogonal to proto - * - * @return TRUE if feature could match Proto. - * @note Exceptions: none - * @note History: Wed Nov 14 17:19:58 1990, DSJ, Created. - */ -BOOL8 DummyFastMatch ( - FEATURE Feature, - PROTO Proto) -{ - FRECT BoundingBox; - FLOAT32 MaxAngleError; - FLOAT32 AngleError; - - MaxAngleError = training_angle_pad / 360.0; - AngleError = fabs (Proto->Angle - Feature->Params[PicoFeatDir]); - if (AngleError > 0.5) - AngleError = 1.0 - AngleError; - - if (AngleError > MaxAngleError) - return (FALSE); - - ComputePaddedBoundingBox (Proto, - training_tangent_bbox_pad * GetPicoFeatureLength (), - training_orthogonal_bbox_pad * GetPicoFeatureLength (), - &BoundingBox); - - return PointInside(&BoundingBox, Feature->Params[PicoFeatX], - Feature->Params[PicoFeatY]); -} /* DummyFastMatch */ - -/** - * This routine computes a bounding box that encloses the - * specified proto along with some padding. The - * amount of padding is specified as separate distances - * in the tangential and orthogonal directions. - * - * @param Proto proto to compute bounding box for - * @param TangentPad amount of pad to add in direction of segment - * @param OrthogonalPad amount of pad to add orthogonal to segment - * @param[out] BoundingBox place to put results - * - * Globals: none - * - * @return none (results are returned in BoundingBox) - * @note Exceptions: none - * @note History: Wed Nov 14 14:55:30 1990, DSJ, Created. - */ -void ComputePaddedBoundingBox (PROTO Proto, FLOAT32 TangentPad, - FLOAT32 OrthogonalPad, FRECT *BoundingBox) { - FLOAT32 Pad, Length, Angle; - FLOAT32 CosOfAngle, SinOfAngle; - - Length = Proto->Length / 2.0 + TangentPad; - Angle = Proto->Angle * 2.0 * PI; - CosOfAngle = fabs(cos(Angle)); - SinOfAngle = fabs(sin(Angle)); - - Pad = MAX (CosOfAngle * Length, SinOfAngle * OrthogonalPad); - BoundingBox->MinX = Proto->X - Pad; - BoundingBox->MaxX = Proto->X + Pad; - - Pad = MAX(SinOfAngle * Length, CosOfAngle * OrthogonalPad); - BoundingBox->MinY = Proto->Y - Pad; - BoundingBox->MaxY = Proto->Y + Pad; - -} /* ComputePaddedBoundingBox */ - -/** - * Return TRUE if point (X,Y) is inside of Rectangle. - * - * Globals: none - * - * @return TRUE if point (X,Y) is inside of Rectangle. - * @note Exceptions: none - * @note History: Wed Nov 14 17:26:35 1990, DSJ, Created. - */ -BOOL8 PointInside(FRECT *Rectangle, FLOAT32 X, FLOAT32 Y) { - if (X < Rectangle->MinX) return (FALSE); - if (X > Rectangle->MaxX) return (FALSE); - if (Y < Rectangle->MinY) return (FALSE); - if (Y > Rectangle->MaxY) return (FALSE); - return (TRUE); - -} /* PointInside */ +/****************************************************************************** +** Filename: MergeNF.c +** Purpose: Program for merging similar nano-feature protos +** Author: Dan Johnson +** History: Wed Nov 21 09:55:23 1990, DSJ, Created. +** + ** (c) Copyright Hewlett-Packard Company, 1988. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. +******************************************************************************/ +#include "mergenf.h" +#include "host.h" +#include "efio.h" +#include "clusttool.h" +#include "cluster.h" +#include "oldlist.h" +#include "protos.h" +#include "ndminx.h" +#include "ocrfeatures.h" +#include "const.h" +#include "featdefs.h" +#include "intproto.h" +#include "params.h" + +#include +#include +#include + +/*-------------------once in subfeat---------------------------------*/ +double_VAR(training_angle_match_scale, 1.0, "Angle Match Scale ..."); + +double_VAR(training_similarity_midpoint, 0.0075, "Similarity Midpoint ..."); + +double_VAR(training_similarity_curl, 2.0, "Similarity Curl ..."); + +/*-----------------------------once in fasttrain----------------------------------*/ +double_VAR(training_tangent_bbox_pad, 0.5, "Tangent bounding box pad ..."); + +double_VAR(training_orthogonal_bbox_pad, 2.5, "Orthogonal bounding box pad ..."); + +double_VAR(training_angle_pad, 45.0, "Angle pad ..."); + +/** + * Compare protos p1 and p2 and return an estimate of the + * worst evidence rating that will result for any part of p1 + * that is compared to p2. In other words, if p1 were broken + * into pico-features and each pico-feature was matched to p2, + * what is the worst evidence rating that will be achieved for + * any pico-feature. + * + * @param p1, p2 protos to be compared + * + * Globals: none + * + * @return Worst possible result when matching p1 to p2. + * @note Exceptions: none + * @note History: Mon Nov 26 08:27:53 1990, DSJ, Created. + */ +FLOAT32 CompareProtos(PROTO p1, PROTO p2) { + FEATURE Feature; + FLOAT32 WorstEvidence = WORST_EVIDENCE; + FLOAT32 Evidence; + FLOAT32 Angle, Length; + + /* if p1 and p2 are not close in length, don't let them match */ + Length = fabs (p1->Length - p2->Length); + if (Length > MAX_LENGTH_MISMATCH) + return (0.0); + + /* create a dummy pico-feature to be used for comparisons */ + Feature = NewFeature (&PicoFeatDesc); + Feature->Params[PicoFeatDir] = p1->Angle; + + /* convert angle to radians */ + Angle = p1->Angle * 2.0 * PI; + + /* find distance from center of p1 to 1/2 picofeat from end */ + Length = p1->Length / 2.0 - GetPicoFeatureLength () / 2.0; + if (Length < 0) Length = 0; + + /* set the dummy pico-feature at one end of p1 and match it to p2 */ + Feature->Params[PicoFeatX] = p1->X + cos (Angle) * Length; + Feature->Params[PicoFeatY] = p1->Y + sin (Angle) * Length; + if (DummyFastMatch (Feature, p2)) { + Evidence = SubfeatureEvidence (Feature, p2); + if (Evidence < WorstEvidence) + WorstEvidence = Evidence; + } else { + FreeFeature(Feature); + return 0.0; + } + + /* set the dummy pico-feature at the other end of p1 and match it to p2 */ + Feature->Params[PicoFeatX] = p1->X - cos (Angle) * Length; + Feature->Params[PicoFeatY] = p1->Y - sin (Angle) * Length; + if (DummyFastMatch (Feature, p2)) { + Evidence = SubfeatureEvidence (Feature, p2); + if (Evidence < WorstEvidence) + WorstEvidence = Evidence; + } else { + FreeFeature(Feature); + return 0.0; + } + + FreeFeature (Feature); + return (WorstEvidence); + +} /* CompareProtos */ + +/** + * This routine computes a proto which is the weighted + * average of protos p1 and p2. The new proto is returned + * in MergedProto. + * + * @param p1, p2 protos to be merged + * @param w1, w2 weight of each proto + * @param MergedProto place to put resulting merged proto + * + * Globals: none + * + * @return none (results are returned in MergedProto) + * @note Exceptions: none + * @note History: Mon Nov 26 08:15:08 1990, DSJ, Created. + */ +void ComputeMergedProto (PROTO p1, + PROTO p2, + FLOAT32 w1, + FLOAT32 w2, + PROTO MergedProto) { + FLOAT32 TotalWeight; + + TotalWeight = w1 + w2; + w1 /= TotalWeight; + w2 /= TotalWeight; + + MergedProto->X = p1->X * w1 + p2->X * w2; + MergedProto->Y = p1->Y * w1 + p2->Y * w2; + MergedProto->Length = p1->Length * w1 + p2->Length * w2; + MergedProto->Angle = p1->Angle * w1 + p2->Angle * w2; + FillABC(MergedProto); +} /* ComputeMergedProto */ + +/** + * This routine searches through all of the prototypes in + * Class and returns the id of the proto which would provide + * the best approximation of Prototype. If no close + * approximation can be found, NO_PROTO is returned. + * + * @param Class class to search for matching old proto in + * @param NumMerged # of protos merged into each proto of Class + * @param Prototype new proto to find match for + * + * Globals: none + * + * @return Id of closest proto in Class or NO_PROTO. + * @note Exceptions: none + * @note History: Sat Nov 24 11:42:58 1990, DSJ, Created. + */ +int FindClosestExistingProto(CLASS_TYPE Class, int NumMerged[], + PROTOTYPE *Prototype) { + PROTO_STRUCT NewProto; + PROTO_STRUCT MergedProto; + int Pid; + PROTO Proto; + int BestProto; + FLOAT32 BestMatch; + FLOAT32 Match, OldMatch, NewMatch; + + MakeNewFromOld (&NewProto, Prototype); + + BestProto = NO_PROTO; + BestMatch = WORST_MATCH_ALLOWED; + for (Pid = 0; Pid < Class->NumProtos; Pid++) { + Proto = ProtoIn(Class, Pid); + ComputeMergedProto(Proto, &NewProto, + (FLOAT32) NumMerged[Pid], 1.0, &MergedProto); + OldMatch = CompareProtos(Proto, &MergedProto); + NewMatch = CompareProtos(&NewProto, &MergedProto); + Match = MIN(OldMatch, NewMatch); + if (Match > BestMatch) { + BestProto = Pid; + BestMatch = Match; + } + } + return BestProto; +} /* FindClosestExistingProto */ + +/** + * This fills in the fields of the New proto based on the + * fields of the Old proto. + * + * @param New new proto to be filled in + * @param Old old proto to be converted + * + * Globals: none + * + * Exceptions: none + * History: Mon Nov 26 09:45:39 1990, DSJ, Created. + */ +void MakeNewFromOld(PROTO New, PROTOTYPE *Old) { + New->X = CenterX(Old->Mean); + New->Y = CenterY(Old->Mean); + New->Length = LengthOf(Old->Mean); + New->Angle = OrientationOf(Old->Mean); + FillABC(New); +} /* MakeNewFromOld */ + +/*-------------------once in subfeat---------------------------------*/ + +/** + * @name SubfeatureEvidence + * + * Compare a feature to a prototype. Print the result. + */ +FLOAT32 SubfeatureEvidence(FEATURE Feature, PROTO Proto) { + float Distance; + float Dangle; + + Dangle = Proto->Angle - Feature->Params[PicoFeatDir]; + if (Dangle < -0.5) Dangle += 1.0; + if (Dangle > 0.5) Dangle -= 1.0; + Dangle *= training_angle_match_scale; + + Distance = Proto->A * Feature->Params[PicoFeatX] + + Proto->B * Feature->Params[PicoFeatY] + + Proto->C; + + return (EvidenceOf (Distance * Distance + Dangle * Dangle)); +} + +/** + * @name EvidenceOf + * + * Return the new type of evidence number corresponding to this + * distance value. This number is no longer based on the chi squared + * approximation. The equation that represents the transform is: + * 1 / (1 + (sim / midpoint) ^ curl) + */ +double EvidenceOf (double Similarity) { + + Similarity /= training_similarity_midpoint; + + if (training_similarity_curl == 3) + Similarity = Similarity * Similarity * Similarity; + else if (training_similarity_curl == 2) + Similarity = Similarity * Similarity; + else + Similarity = pow (Similarity, training_similarity_curl); + + return (1.0 / (1.0 + Similarity)); +} + +/** + * This routine returns TRUE if Feature would be matched + * by a fast match table built from Proto. + * + * @param Feature feature to be "fast matched" to proto + * @param Proto proto being "fast matched" against + * + * Globals: + * - training_tangent_bbox_pad bounding box pad tangent to proto + * - training_orthogonal_bbox_pad bounding box pad orthogonal to proto + * + * @return TRUE if feature could match Proto. + * @note Exceptions: none + * @note History: Wed Nov 14 17:19:58 1990, DSJ, Created. + */ +BOOL8 DummyFastMatch ( + FEATURE Feature, + PROTO Proto) +{ + FRECT BoundingBox; + FLOAT32 MaxAngleError; + FLOAT32 AngleError; + + MaxAngleError = training_angle_pad / 360.0; + AngleError = fabs (Proto->Angle - Feature->Params[PicoFeatDir]); + if (AngleError > 0.5) + AngleError = 1.0 - AngleError; + + if (AngleError > MaxAngleError) + return (FALSE); + + ComputePaddedBoundingBox (Proto, + training_tangent_bbox_pad * GetPicoFeatureLength (), + training_orthogonal_bbox_pad * GetPicoFeatureLength (), + &BoundingBox); + + return PointInside(&BoundingBox, Feature->Params[PicoFeatX], + Feature->Params[PicoFeatY]); +} /* DummyFastMatch */ + +/** + * This routine computes a bounding box that encloses the + * specified proto along with some padding. The + * amount of padding is specified as separate distances + * in the tangential and orthogonal directions. + * + * @param Proto proto to compute bounding box for + * @param TangentPad amount of pad to add in direction of segment + * @param OrthogonalPad amount of pad to add orthogonal to segment + * @param[out] BoundingBox place to put results + * + * Globals: none + * + * @return none (results are returned in BoundingBox) + * @note Exceptions: none + * @note History: Wed Nov 14 14:55:30 1990, DSJ, Created. + */ +void ComputePaddedBoundingBox (PROTO Proto, FLOAT32 TangentPad, + FLOAT32 OrthogonalPad, FRECT *BoundingBox) { + FLOAT32 Pad, Length, Angle; + FLOAT32 CosOfAngle, SinOfAngle; + + Length = Proto->Length / 2.0 + TangentPad; + Angle = Proto->Angle * 2.0 * PI; + CosOfAngle = fabs(cos(Angle)); + SinOfAngle = fabs(sin(Angle)); + + Pad = MAX (CosOfAngle * Length, SinOfAngle * OrthogonalPad); + BoundingBox->MinX = Proto->X - Pad; + BoundingBox->MaxX = Proto->X + Pad; + + Pad = MAX(SinOfAngle * Length, CosOfAngle * OrthogonalPad); + BoundingBox->MinY = Proto->Y - Pad; + BoundingBox->MaxY = Proto->Y + Pad; + +} /* ComputePaddedBoundingBox */ + +/** + * Return TRUE if point (X,Y) is inside of Rectangle. + * + * Globals: none + * + * @return TRUE if point (X,Y) is inside of Rectangle. + * @note Exceptions: none + * @note History: Wed Nov 14 17:26:35 1990, DSJ, Created. + */ +BOOL8 PointInside(FRECT *Rectangle, FLOAT32 X, FLOAT32 Y) { + if (X < Rectangle->MinX) return (FALSE); + if (X > Rectangle->MaxX) return (FALSE); + if (Y < Rectangle->MinY) return (FALSE); + if (Y > Rectangle->MaxY) return (FALSE); + return (TRUE); + +} /* PointInside */ diff --git a/src/training/mergenf.h b/src/training/mergenf.h index e640a0f0ae..384d60caf3 100644 --- a/src/training/mergenf.h +++ b/src/training/mergenf.h @@ -1,103 +1,103 @@ -/****************************************************************************** -** Filename: MergeNF.c -** Purpose: Program for merging similar nano-feature protos -** Author: Dan Johnson -** History: Wed Nov 21 09:55:23 1990, DSJ, Created. -** - ** (c) Copyright Hewlett-Packard Company, 1988. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. -******************************************************************************/ - -#ifndef TESSERACT_TRAINING_MERGENF_H_ -#define TESSERACT_TRAINING_MERGENF_H_ - -/**---------------------------------------------------------------------------- - Include Files and Type Defines -----------------------------------------------------------------------------**/ -#include "protos.h" -#include "cluster.h" -#include "ocrfeatures.h" -#include "callcpp.h" -#include "picofeat.h" - - -#define WORST_MATCH_ALLOWED (0.9) -#define WORST_EVIDENCE (1.0) -#define MAX_LENGTH_MISMATCH (2.0 * GetPicoFeatureLength ()) - - -#define PROTO_SUFFIX ".mf.p" -#define CONFIG_SUFFIX ".cl" -#define NO_PROTO (-1) -#define XPOSITION 0 -#define YPOSITION 1 -#define MFLENGTH 2 -#define ORIENTATION 3 - -typedef struct -{ - FLOAT32 MinX, MaxX, MinY, MaxY; -} FRECT; - -/**---------------------------------------------------------------------------- - Public Macros -----------------------------------------------------------------------------**/ -#define CenterX(M) ( (M)[XPOSITION] ) -#define CenterY(M) ( (M)[YPOSITION] ) -#define LengthOf(M) ( (M)[MFLENGTH] ) -#define OrientationOf(M) ( (M)[ORIENTATION] ) - -/**---------------------------------------------------------------------------- - Public Function Prototypes -----------------------------------------------------------------------------**/ -FLOAT32 CompareProtos ( - PROTO p1, - PROTO p2); - -void ComputeMergedProto ( - PROTO p1, - PROTO p2, - FLOAT32 w1, - FLOAT32 w2, - PROTO MergedProto); - -int FindClosestExistingProto ( - CLASS_TYPE Class, - int NumMerged[], - PROTOTYPE *Prototype); - -void MakeNewFromOld ( - PROTO New, - PROTOTYPE *Old); - -FLOAT32 SubfeatureEvidence ( - FEATURE Feature, - PROTO Proto); - -double EvidenceOf ( - register double Similarity); - -BOOL8 DummyFastMatch ( - FEATURE Feature, - PROTO Proto); - -void ComputePaddedBoundingBox ( - PROTO Proto, - FLOAT32 TangentPad, - FLOAT32 OrthogonalPad, - FRECT *BoundingBox); - -BOOL8 PointInside ( - FRECT *Rectangle, - FLOAT32 X, - FLOAT32 Y); - -#endif // TESSERACT_TRAINING_MERGENF_H_ +/****************************************************************************** +** Filename: MergeNF.c +** Purpose: Program for merging similar nano-feature protos +** Author: Dan Johnson +** History: Wed Nov 21 09:55:23 1990, DSJ, Created. +** + ** (c) Copyright Hewlett-Packard Company, 1988. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. +******************************************************************************/ + +#ifndef TESSERACT_TRAINING_MERGENF_H_ +#define TESSERACT_TRAINING_MERGENF_H_ + +/**---------------------------------------------------------------------------- + Include Files and Type Defines +----------------------------------------------------------------------------**/ +#include "protos.h" +#include "cluster.h" +#include "ocrfeatures.h" +#include "callcpp.h" +#include "picofeat.h" + + +#define WORST_MATCH_ALLOWED (0.9) +#define WORST_EVIDENCE (1.0) +#define MAX_LENGTH_MISMATCH (2.0 * GetPicoFeatureLength ()) + + +#define PROTO_SUFFIX ".mf.p" +#define CONFIG_SUFFIX ".cl" +#define NO_PROTO (-1) +#define XPOSITION 0 +#define YPOSITION 1 +#define MFLENGTH 2 +#define ORIENTATION 3 + +typedef struct +{ + FLOAT32 MinX, MaxX, MinY, MaxY; +} FRECT; + +/**---------------------------------------------------------------------------- + Public Macros +----------------------------------------------------------------------------**/ +#define CenterX(M) ( (M)[XPOSITION] ) +#define CenterY(M) ( (M)[YPOSITION] ) +#define LengthOf(M) ( (M)[MFLENGTH] ) +#define OrientationOf(M) ( (M)[ORIENTATION] ) + +/**---------------------------------------------------------------------------- + Public Function Prototypes +----------------------------------------------------------------------------**/ +FLOAT32 CompareProtos ( + PROTO p1, + PROTO p2); + +void ComputeMergedProto ( + PROTO p1, + PROTO p2, + FLOAT32 w1, + FLOAT32 w2, + PROTO MergedProto); + +int FindClosestExistingProto ( + CLASS_TYPE Class, + int NumMerged[], + PROTOTYPE *Prototype); + +void MakeNewFromOld ( + PROTO New, + PROTOTYPE *Old); + +FLOAT32 SubfeatureEvidence ( + FEATURE Feature, + PROTO Proto); + +double EvidenceOf ( + register double Similarity); + +BOOL8 DummyFastMatch ( + FEATURE Feature, + PROTO Proto); + +void ComputePaddedBoundingBox ( + PROTO Proto, + FLOAT32 TangentPad, + FLOAT32 OrthogonalPad, + FRECT *BoundingBox); + +BOOL8 PointInside ( + FRECT *Rectangle, + FLOAT32 X, + FLOAT32 Y); + +#endif // TESSERACT_TRAINING_MERGENF_H_ diff --git a/src/training/tlog.cpp b/src/training/tlog.cpp index 7c32c573ab..e493bd090c 100644 --- a/src/training/tlog.cpp +++ b/src/training/tlog.cpp @@ -1,23 +1,23 @@ -/********************************************************************** - * File: tlog.cpp - * Description: Variant of printf with logging level controllable by a - * commandline flag. - * Author: Ranjith Unnikrishnan - * Created: Wed Nov 20 2013 - * - * (C) Copyright 2013, Google Inc. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -#include "tlog.h" - -INT_PARAM_FLAG(tlog_level, 0, "Minimum logging level for tlog() output"); +/********************************************************************** + * File: tlog.cpp + * Description: Variant of printf with logging level controllable by a + * commandline flag. + * Author: Ranjith Unnikrishnan + * Created: Wed Nov 20 2013 + * + * (C) Copyright 2013, Google Inc. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +#include "tlog.h" + +INT_PARAM_FLAG(tlog_level, 0, "Minimum logging level for tlog() output"); diff --git a/src/training/tlog.h b/src/training/tlog.h index cf7de652f4..6dcf6e6c3b 100644 --- a/src/training/tlog.h +++ b/src/training/tlog.h @@ -1,41 +1,41 @@ -/********************************************************************** - * File: tlog.h - * Description: Variant of printf with logging level controllable by a - * commandline flag. - * Author: Ranjith Unnikrishnan - * Created: Wed Nov 20 2013 - * - * (C) Copyright 2013, Google Inc. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ -#ifndef TESSERACT_TRAINING_TLOG_H_ -#define TESSERACT_TRAINING_TLOG_H_ - -#include "commandlineflags.h" -#include "errcode.h" -#include "tprintf.h" - -DECLARE_INT_PARAM_FLAG(tlog_level); - -// Variant guarded by the numeric logging level parameter FLAGS_tlog_level -// (default 0). Code using ParseCommandLineFlags() can control its value using -// the --tlog_level commandline argument. Otherwise it must be specified in a -// config file like other params. -#define tlog(level, ...) { \ - if (FLAGS_tlog_level >= level) { \ - tprintf_internal(__VA_ARGS__); \ - } \ -} - -#define TLOG_IS_ON(level) (FLAGS_tlog_level >= level) - -#endif // TESSERACT_TRAINING_TLOG_H_ +/********************************************************************** + * File: tlog.h + * Description: Variant of printf with logging level controllable by a + * commandline flag. + * Author: Ranjith Unnikrishnan + * Created: Wed Nov 20 2013 + * + * (C) Copyright 2013, Google Inc. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ +#ifndef TESSERACT_TRAINING_TLOG_H_ +#define TESSERACT_TRAINING_TLOG_H_ + +#include "commandlineflags.h" +#include "errcode.h" +#include "tprintf.h" + +DECLARE_INT_PARAM_FLAG(tlog_level); + +// Variant guarded by the numeric logging level parameter FLAGS_tlog_level +// (default 0). Code using ParseCommandLineFlags() can control its value using +// the --tlog_level commandline argument. Otherwise it must be specified in a +// config file like other params. +#define tlog(level, ...) { \ + if (FLAGS_tlog_level >= level) { \ + tprintf_internal(__VA_ARGS__); \ + } \ +} + +#define TLOG_IS_ON(level) (FLAGS_tlog_level >= level) + +#endif // TESSERACT_TRAINING_TLOG_H_ diff --git a/src/training/validate_grapheme.h b/src/training/validate_grapheme.h index 3f06e48172..138ad57075 100644 --- a/src/training/validate_grapheme.h +++ b/src/training/validate_grapheme.h @@ -1,35 +1,35 @@ -#ifndef TESSERACT_TRAINING_VALIDATE_GRAPHEME_H_ -#define TESSERACT_TRAINING_VALIDATE_GRAPHEME_H_ - -#include "validator.h" - -namespace tesseract { - -// Subclass of Validator that validates and segments generic unicode into -// grapheme clusters, including Latin with diacritics. -class ValidateGrapheme : public Validator { - public: - ValidateGrapheme(ViramaScript script, bool report_errors) - : Validator(script, report_errors) {} - ~ValidateGrapheme() {} - - protected: - // Consumes the next Grapheme in codes_[codes_used_++...] and copies it to - // parts_ and output_. Returns true if a valid Grapheme was consumed, - // otherwise does not increment codes_used_. - bool ConsumeGraphemeIfValid() override; - // Returns the CharClass corresponding to the given Unicode ch. - CharClass UnicodeToCharClass(char32 ch) const override; - - private: - // Helper returns true if the sequence prev_ch,ch is invalid. - bool IsBadlyFormed(char32 prev_ch, char32 ch); - // Helper returns true if the sequence prev_ch,ch is an invalid Indic vowel. - static bool IsBadlyFormedIndicVowel(char32 prev_ch, char32 ch); - // Helper returns true if the sequence prev_ch,ch is invalid Thai. - static bool IsBadlyFormedThai(char32 prev_ch, char32 ch); -}; - -} // namespace tesseract - -#endif // TESSERACT_TRAINING_VALIDATE_GRAPHEME_H_ +#ifndef TESSERACT_TRAINING_VALIDATE_GRAPHEME_H_ +#define TESSERACT_TRAINING_VALIDATE_GRAPHEME_H_ + +#include "validator.h" + +namespace tesseract { + +// Subclass of Validator that validates and segments generic unicode into +// grapheme clusters, including Latin with diacritics. +class ValidateGrapheme : public Validator { + public: + ValidateGrapheme(ViramaScript script, bool report_errors) + : Validator(script, report_errors) {} + ~ValidateGrapheme() {} + + protected: + // Consumes the next Grapheme in codes_[codes_used_++...] and copies it to + // parts_ and output_. Returns true if a valid Grapheme was consumed, + // otherwise does not increment codes_used_. + bool ConsumeGraphemeIfValid() override; + // Returns the CharClass corresponding to the given Unicode ch. + CharClass UnicodeToCharClass(char32 ch) const override; + + private: + // Helper returns true if the sequence prev_ch,ch is invalid. + bool IsBadlyFormed(char32 prev_ch, char32 ch); + // Helper returns true if the sequence prev_ch,ch is an invalid Indic vowel. + static bool IsBadlyFormedIndicVowel(char32 prev_ch, char32 ch); + // Helper returns true if the sequence prev_ch,ch is invalid Thai. + static bool IsBadlyFormedThai(char32 prev_ch, char32 ch); +}; + +} // namespace tesseract + +#endif // TESSERACT_TRAINING_VALIDATE_GRAPHEME_H_ diff --git a/src/training/validate_indic.h b/src/training/validate_indic.h index 9c1656af9c..62dbcb23d1 100644 --- a/src/training/validate_indic.h +++ b/src/training/validate_indic.h @@ -1,44 +1,44 @@ -#ifndef TESSERACT_TRAINING_VALIDATE_INDIC_H_ -#define TESSERACT_TRAINING_VALIDATE_INDIC_H_ - -#include "validator.h" - -namespace tesseract { - -// Subclass of Validator that validates and segments Indic scripts in the -// unicode range 0x900-0xdff (Devanagari-Sinhala). -class ValidateIndic : public Validator { - public: - ValidateIndic(ViramaScript script, bool report_errors) - : Validator(script, report_errors) {} - ~ValidateIndic() {} - - protected: - // Returns whether codes matches the pattern for an Indic Grapheme. - // Consumes the next Grapheme in codes_[codes_used_++...] and copies it to - // parts_ and output_. Returns true if a valid Grapheme was consumed, - // otherwise does not increment codes_used_. - bool ConsumeGraphemeIfValid() override; - // Returns the CharClass corresponding to the given Unicode ch. - Validator::CharClass UnicodeToCharClass(char32 ch) const override; - - private: - // Helper consumes/copies a virama and any associated post-virama joiners. - bool ConsumeViramaIfValid(IndicPair joiner, bool post_matra); - // Helper consumes/copies a series of consonants separated by viramas while - // valid, but not any vowel or other modifiers. - bool ConsumeConsonantHeadIfValid(); - // Helper consumes/copies a tail part of a consonant, comprising optional - // matra/piece, vowel modifier, vedic mark, terminating virama. - bool ConsumeConsonantTailIfValid(); - // Helper consumes/copies a vowel and optional modifiers. - bool ConsumeVowelIfValid(); - - // Some special unicodes used only for Indic processing. - static const char32 kYayana = 0xdba; // Sinhala Ya - static const char32 kRayana = 0xdbb; // Sinhala Ra -}; - -} // namespace tesseract - -#endif // TESSERACT_TRAINING_VALIDATE_INDIC_H_ +#ifndef TESSERACT_TRAINING_VALIDATE_INDIC_H_ +#define TESSERACT_TRAINING_VALIDATE_INDIC_H_ + +#include "validator.h" + +namespace tesseract { + +// Subclass of Validator that validates and segments Indic scripts in the +// unicode range 0x900-0xdff (Devanagari-Sinhala). +class ValidateIndic : public Validator { + public: + ValidateIndic(ViramaScript script, bool report_errors) + : Validator(script, report_errors) {} + ~ValidateIndic() {} + + protected: + // Returns whether codes matches the pattern for an Indic Grapheme. + // Consumes the next Grapheme in codes_[codes_used_++...] and copies it to + // parts_ and output_. Returns true if a valid Grapheme was consumed, + // otherwise does not increment codes_used_. + bool ConsumeGraphemeIfValid() override; + // Returns the CharClass corresponding to the given Unicode ch. + Validator::CharClass UnicodeToCharClass(char32 ch) const override; + + private: + // Helper consumes/copies a virama and any associated post-virama joiners. + bool ConsumeViramaIfValid(IndicPair joiner, bool post_matra); + // Helper consumes/copies a series of consonants separated by viramas while + // valid, but not any vowel or other modifiers. + bool ConsumeConsonantHeadIfValid(); + // Helper consumes/copies a tail part of a consonant, comprising optional + // matra/piece, vowel modifier, vedic mark, terminating virama. + bool ConsumeConsonantTailIfValid(); + // Helper consumes/copies a vowel and optional modifiers. + bool ConsumeVowelIfValid(); + + // Some special unicodes used only for Indic processing. + static const char32 kYayana = 0xdba; // Sinhala Ya + static const char32 kRayana = 0xdbb; // Sinhala Ra +}; + +} // namespace tesseract + +#endif // TESSERACT_TRAINING_VALIDATE_INDIC_H_ diff --git a/src/training/validate_khmer.cpp b/src/training/validate_khmer.cpp index 709b908d05..45c8f061de 100644 --- a/src/training/validate_khmer.cpp +++ b/src/training/validate_khmer.cpp @@ -1,106 +1,106 @@ -#include "validate_khmer.h" -#include "errcode.h" -#include "tprintf.h" - -namespace tesseract { - -// Returns whether codes matches the pattern for a Khmer Grapheme. -// Taken from unicode standard: -// http://www.unicode.org/versions/Unicode9.0.0/ch16.pdf. -// where it gives: B {R | C} {S {R}}* {{Z} V} {O} {S}, using different notation -// to the ISCII standard http://varamozhi.sourceforge.net/iscii91.pdf. -// Translated to the codes used by the CharClass enum: -// C {R | N} {HC {R}}* {{Z|z} M{P}} {D} {HC} -// Where R is a new symbol (Robat) and N is repurposed as a consonant shifter. -// Also the Consonant class here includes independent vowels, as they are -// treated the same anyway. -// In the split grapheme mode, the only characters that get grouped are the -// HC and the {Z|z}M The unicode chapter on Khmer only mentions the joiners in -// the BNF syntax, so who knows what they do. -bool ValidateKhmer::ConsumeGraphemeIfValid() { - int num_codes = codes_.size(); - if (codes_used_ == num_codes) return false; - if (codes_[codes_used_].first == CharClass::kOther) { - UseMultiCode(1); - return true; - } - if (codes_[codes_used_].first != CharClass::kConsonant) { - if (report_errors_) { - tprintf("Invalid start of Khmer syllable:0x%x\n", - codes_[codes_used_].second); - } - return false; - } - if (UseMultiCode(1)) return true; - if (codes_[codes_used_].first == CharClass::kRobat || - codes_[codes_used_].first == CharClass::kNukta) { - if (UseMultiCode(1)) return true; - } - while (codes_used_ + 1 < num_codes && - codes_[codes_used_].first == CharClass::kVirama && - codes_[codes_used_ + 1].first == CharClass::kConsonant) { - ASSERT_HOST(!CodeOnlyToOutput()); - if (UseMultiCode(2)) return true; - if (codes_[codes_used_].first == CharClass::kRobat) { - if (UseMultiCode(1)) return true; - } - } - int num_matra_parts = 0; - if (codes_[codes_used_].second == kZeroWidthJoiner || - codes_[codes_used_].second == kZeroWidthNonJoiner) { - if (CodeOnlyToOutput()) { - if (report_errors_) { - tprintf("Unterminated joiner: 0x%x\n", output_.back()); - } - return false; - } - ++num_matra_parts; - } - // Not quite as shown by the BNF, the matra piece is allowed as a matra on its - // own or as an addition to other matras. - if (codes_[codes_used_].first == CharClass::kMatra || - codes_[codes_used_].first == CharClass::kMatraPiece) { - ++num_matra_parts; - if (UseMultiCode(num_matra_parts)) return true; - } else if (num_matra_parts) { - if (report_errors_) { - tprintf("Joiner with non-dependent vowel after it!:0x%x 0x%x\n", - output_.back(), codes_[codes_used_].second); - } - return false; - } - if (codes_[codes_used_].first == CharClass::kMatraPiece && - codes_[codes_used_ - 1].first != CharClass::kMatraPiece) { - if (UseMultiCode(1)) return true; - } - if (codes_[codes_used_].first == CharClass::kVowelModifier) { - if (UseMultiCode(1)) return true; - } - if (codes_used_ + 1 < num_codes && - codes_[codes_used_].first == CharClass::kVirama && - codes_[codes_used_ + 1].first == CharClass::kConsonant) { - ASSERT_HOST(!CodeOnlyToOutput()); - if (UseMultiCode(2)) return true; - } - return true; -} - -Validator::CharClass ValidateKhmer::UnicodeToCharClass(char32 ch) const { - if (IsVedicAccent(ch)) return CharClass::kVedicMark; - if (ch == kZeroWidthNonJoiner) return CharClass::kZeroWidthNonJoiner; - if (ch == kZeroWidthJoiner) return CharClass::kZeroWidthJoiner; - // Offset from the start of the relevant unicode code block aka code page. - int off = ch - static_cast(script_); - // Anything in another code block is other. - if (off < 0 || off >= kIndicCodePageSize) return CharClass::kOther; - if (off <= 0x33) return CharClass::kConsonant; - if (off <= 0x45) return CharClass::kMatra; - if (off == 0x46) return CharClass::kMatraPiece; - if (off == 0x4c) return CharClass::kRobat; - if (off == 0x49 || off == 0x4a) return CharClass::kNukta; - if (off <= 0x51) return CharClass::kVowelModifier; - if (off == 0x52) return CharClass::kVirama; - return CharClass::kOther; -} - -} // namespace tesseract +#include "validate_khmer.h" +#include "errcode.h" +#include "tprintf.h" + +namespace tesseract { + +// Returns whether codes matches the pattern for a Khmer Grapheme. +// Taken from unicode standard: +// http://www.unicode.org/versions/Unicode9.0.0/ch16.pdf. +// where it gives: B {R | C} {S {R}}* {{Z} V} {O} {S}, using different notation +// to the ISCII standard http://varamozhi.sourceforge.net/iscii91.pdf. +// Translated to the codes used by the CharClass enum: +// C {R | N} {HC {R}}* {{Z|z} M{P}} {D} {HC} +// Where R is a new symbol (Robat) and N is repurposed as a consonant shifter. +// Also the Consonant class here includes independent vowels, as they are +// treated the same anyway. +// In the split grapheme mode, the only characters that get grouped are the +// HC and the {Z|z}M The unicode chapter on Khmer only mentions the joiners in +// the BNF syntax, so who knows what they do. +bool ValidateKhmer::ConsumeGraphemeIfValid() { + int num_codes = codes_.size(); + if (codes_used_ == num_codes) return false; + if (codes_[codes_used_].first == CharClass::kOther) { + UseMultiCode(1); + return true; + } + if (codes_[codes_used_].first != CharClass::kConsonant) { + if (report_errors_) { + tprintf("Invalid start of Khmer syllable:0x%x\n", + codes_[codes_used_].second); + } + return false; + } + if (UseMultiCode(1)) return true; + if (codes_[codes_used_].first == CharClass::kRobat || + codes_[codes_used_].first == CharClass::kNukta) { + if (UseMultiCode(1)) return true; + } + while (codes_used_ + 1 < num_codes && + codes_[codes_used_].first == CharClass::kVirama && + codes_[codes_used_ + 1].first == CharClass::kConsonant) { + ASSERT_HOST(!CodeOnlyToOutput()); + if (UseMultiCode(2)) return true; + if (codes_[codes_used_].first == CharClass::kRobat) { + if (UseMultiCode(1)) return true; + } + } + int num_matra_parts = 0; + if (codes_[codes_used_].second == kZeroWidthJoiner || + codes_[codes_used_].second == kZeroWidthNonJoiner) { + if (CodeOnlyToOutput()) { + if (report_errors_) { + tprintf("Unterminated joiner: 0x%x\n", output_.back()); + } + return false; + } + ++num_matra_parts; + } + // Not quite as shown by the BNF, the matra piece is allowed as a matra on its + // own or as an addition to other matras. + if (codes_[codes_used_].first == CharClass::kMatra || + codes_[codes_used_].first == CharClass::kMatraPiece) { + ++num_matra_parts; + if (UseMultiCode(num_matra_parts)) return true; + } else if (num_matra_parts) { + if (report_errors_) { + tprintf("Joiner with non-dependent vowel after it!:0x%x 0x%x\n", + output_.back(), codes_[codes_used_].second); + } + return false; + } + if (codes_[codes_used_].first == CharClass::kMatraPiece && + codes_[codes_used_ - 1].first != CharClass::kMatraPiece) { + if (UseMultiCode(1)) return true; + } + if (codes_[codes_used_].first == CharClass::kVowelModifier) { + if (UseMultiCode(1)) return true; + } + if (codes_used_ + 1 < num_codes && + codes_[codes_used_].first == CharClass::kVirama && + codes_[codes_used_ + 1].first == CharClass::kConsonant) { + ASSERT_HOST(!CodeOnlyToOutput()); + if (UseMultiCode(2)) return true; + } + return true; +} + +Validator::CharClass ValidateKhmer::UnicodeToCharClass(char32 ch) const { + if (IsVedicAccent(ch)) return CharClass::kVedicMark; + if (ch == kZeroWidthNonJoiner) return CharClass::kZeroWidthNonJoiner; + if (ch == kZeroWidthJoiner) return CharClass::kZeroWidthJoiner; + // Offset from the start of the relevant unicode code block aka code page. + int off = ch - static_cast(script_); + // Anything in another code block is other. + if (off < 0 || off >= kIndicCodePageSize) return CharClass::kOther; + if (off <= 0x33) return CharClass::kConsonant; + if (off <= 0x45) return CharClass::kMatra; + if (off == 0x46) return CharClass::kMatraPiece; + if (off == 0x4c) return CharClass::kRobat; + if (off == 0x49 || off == 0x4a) return CharClass::kNukta; + if (off <= 0x51) return CharClass::kVowelModifier; + if (off == 0x52) return CharClass::kVirama; + return CharClass::kOther; +} + +} // namespace tesseract diff --git a/src/training/validate_khmer.h b/src/training/validate_khmer.h index e9897010ca..a2fe75c962 100644 --- a/src/training/validate_khmer.h +++ b/src/training/validate_khmer.h @@ -1,27 +1,27 @@ -#ifndef TESSERACT_TRAINING_VALIDATE_KHMER_H_ -#define TESSERACT_TRAINING_VALIDATE_KHMER_H_ - -#include "validator.h" - -namespace tesseract { - -// Subclass of Validator that validates and segments Khmer. -class ValidateKhmer : public Validator { - public: - ValidateKhmer(ViramaScript script, bool report_errors) - : Validator(script, report_errors) {} - ~ValidateKhmer() {} - - protected: - // Returns whether codes matches the pattern for an Khmer Grapheme. - // Consumes the next Grapheme in codes_[codes_used_++...] and copies it to - // parts_ and output_. Returns true if a valid Grapheme was consumed, - // otherwise does not increment codes_used_. - bool ConsumeGraphemeIfValid() override; - // Returns the CharClass corresponding to the given Unicode ch. - CharClass UnicodeToCharClass(char32 ch) const override; -}; - -} // namespace tesseract - -#endif // TESSERACT_TRAINING_VALIDATE_KHMER_H_ +#ifndef TESSERACT_TRAINING_VALIDATE_KHMER_H_ +#define TESSERACT_TRAINING_VALIDATE_KHMER_H_ + +#include "validator.h" + +namespace tesseract { + +// Subclass of Validator that validates and segments Khmer. +class ValidateKhmer : public Validator { + public: + ValidateKhmer(ViramaScript script, bool report_errors) + : Validator(script, report_errors) {} + ~ValidateKhmer() {} + + protected: + // Returns whether codes matches the pattern for an Khmer Grapheme. + // Consumes the next Grapheme in codes_[codes_used_++...] and copies it to + // parts_ and output_. Returns true if a valid Grapheme was consumed, + // otherwise does not increment codes_used_. + bool ConsumeGraphemeIfValid() override; + // Returns the CharClass corresponding to the given Unicode ch. + CharClass UnicodeToCharClass(char32 ch) const override; +}; + +} // namespace tesseract + +#endif // TESSERACT_TRAINING_VALIDATE_KHMER_H_ diff --git a/src/training/validate_myanmar.cpp b/src/training/validate_myanmar.cpp index 3e822e6612..4493469023 100644 --- a/src/training/validate_myanmar.cpp +++ b/src/training/validate_myanmar.cpp @@ -1,160 +1,160 @@ -#include "validate_myanmar.h" -#include "errcode.h" -#include "icuerrorcode.h" -#include "tprintf.h" -#include "unicode/uchar.h" // From libicu -#include "unicode/uscript.h" // From libicu - -namespace tesseract { - -// Returns whether codes matches the pattern for a Myanmar Grapheme. -// Taken directly from the unicode table 16-3. -// See http://www.unicode.org/versions/Unicode9.0.0/ch16.pdf -bool ValidateMyanmar::ConsumeGraphemeIfValid() { - int num_codes = codes_.size(); - if (codes_used_ == num_codes) return true; - // Other. - if (IsMyanmarOther(codes_[codes_used_].second)) { - UseMultiCode(1); - return true; - } - // Kinzi. - if (codes_used_ + 2 < num_codes && codes_[codes_used_].second == 0x1004 && - codes_[codes_used_ + 1].second == kMyanmarAsat && - codes_[codes_used_ + 2].second == kMyanmarVirama) { - ASSERT_HOST(!CodeOnlyToOutput()); - ASSERT_HOST(!CodeOnlyToOutput()); - if (UseMultiCode(3)) return true; - } - // Base consonant/vowel. NOTE that since everything in Myanmar appears to be - // optional, except the base, this is the only place where invalid input can - // be detected and false returned. - if (IsMyanmarLetter(codes_[codes_used_].second)) { - if (UseMultiCode(1)) return true; - } else { - if (report_errors_) { - tprintf("Invalid start of Myanmar syllable:0x%x\n", - codes_[codes_used_].second); - } - return false; // One of these is required. - } - if (ConsumeSubscriptIfPresent()) return true; - ConsumeOptionalSignsIfPresent(); - // What we have consumed so far is a valid syllable. - return true; -} - -// TODO(rays) Doesn't use intermediate coding like the other scripts, as there -// is little correspondence between the content of table 16-3 and the char -// classes of the Indic languages. (Experts may disagree and improve!) -// In unicode table 16-3 there is basically a long list of optional characters, -// which can be coded quite easily. -// Unfortunately, table 16-3 doesn't include even half the Myanmar unicodes!! -// The table also allows sequences that still result in dotted circles!! -// So with a lot of guesswork the rest have been added in a reasonable place. -Validator::CharClass ValidateMyanmar::UnicodeToCharClass(char32 ch) const { - if (IsMyanmarLetter(ch)) return CharClass::kConsonant; - return CharClass::kOther; -} - -// Helper consumes/copies a virama and any subscript consonant. -// Returns true if the end of input is reached. -bool ValidateMyanmar::ConsumeSubscriptIfPresent() { - // Subscript consonant. It appears there can be only one. - int num_codes = codes_.size(); - if (codes_used_ + 1 < num_codes && - codes_[codes_used_].second == kMyanmarVirama) { - if (IsMyanmarLetter(codes_[codes_used_ + 1].second)) { - ASSERT_HOST(!CodeOnlyToOutput()); - if (UseMultiCode(2)) return true; - } - } - return false; -} - -// Helper consumes/copies a series of optional signs. -// Returns true if the end of input is reached. -bool ValidateMyanmar::ConsumeOptionalSignsIfPresent() { - // The following characters are allowed, all optional, and in sequence. - // An exception is kMyanmarMedialYa, which can include kMyanmarAsat. - const std::vector kMedials({kMyanmarAsat, kMyanmarMedialYa, 0x103c, - 0x103d, 0x103e, 0x105e, 0x105f, 0x1060, - 0x1081, 0x1031}); - for (char32 ch : kMedials) { - if (codes_[codes_used_].second == ch) { - if (UseMultiCode(1)) return true; - if (ch == kMyanmarMedialYa && - codes_[codes_used_].second == kMyanmarAsat) { - if (UseMultiCode(1)) return true; - } - } - } - // Vowel sign i, ii, ai. - char32 ch = codes_[codes_used_].second; - if (ch == 0x102d || ch == 0x102e || ch == 0x1032) { - if (UseMultiCode(1)) return true; - } - // Vowel sign u, uu, and extensions. - ch = codes_[codes_used_].second; - if (ch == 0x102f || ch == 0x1030 || (0x1056 <= ch && ch <= 0x1059) || - ch == 0x1062 || ch == 0x1067 || ch == 0x1068 || - (0x1071 <= ch && ch <= 0x1074) || (0x1083 <= ch && ch <= 0x1086) || - ch == 0x109c || ch == 0x109d) { - if (UseMultiCode(1)) return true; - } - // Tall aa, aa with optional asat. - if (codes_[codes_used_].second == 0x102b || - codes_[codes_used_].second == 0x102c) { - if (UseMultiCode(1)) return true; - if (codes_[codes_used_].second == kMyanmarAsat) { - if (UseMultiCode(1)) return true; - } - } - // The following characters are allowed, all optional, and in sequence. - const std::vector kSigns({0x1036, 0x1037}); - for (char32 ch : kSigns) { - if (codes_[codes_used_].second == ch) { - if (UseMultiCode(1)) return true; - } - } - // Tone mark extensions. - ch = codes_[codes_used_].second; - if (ch == 0x1038 || ch == kMyanmarAsat || ch == 0x1063 || ch == 0x1064 || - (0x1069 <= ch && ch <= 0x106d) || (0x1087 <= ch && ch <= 0x108d) || - ch == 0x108f || ch == 0x109a || ch == 0x109b || - (0xaa7b <= ch && ch <= 0xaa7d)) { - if (UseMultiCode(1)) return true; - } - return false; -} - -// Returns true if the unicode is a Myanmar "letter" including consonants -// and independent vowels. Although table 16-3 distinguishes between some -// base consonants and vowels, the extensions make no such distinction, so we -// put them all into a single bucket. -/* static */ -bool ValidateMyanmar::IsMyanmarLetter(char32 ch) { - return (0x1000 <= ch && ch <= 0x102a) || ch == 0x103f || - (0x1050 <= ch && ch <= 0x1055) || (0x105a <= ch && ch <= 0x105d) || - ch == 0x1061 || ch == 0x1065 || ch == 0x1066 || - (0x106e <= ch && ch <= 0x1070) || (0x1075 <= ch && ch <= 0x1080) || - ch == 0x108e || (0xa9e0 <= ch && ch <= 0xa9ef) || - (0xa9fa <= ch && ch <= 0xa9ff) || (0xaa60 <= ch && ch <= 0xaa73) || - ch == 0xaa7a || ch == 0xaa7e || ch == 0xaa7f; -} - -// Returns true if ch is a Myanmar digit or other symbol that does not take -// part in being a syllable. -/* static */ -bool ValidateMyanmar::IsMyanmarOther(char32 ch) { - IcuErrorCode err; - UScriptCode script_code = uscript_getScript(ch, err); - if (script_code != USCRIPT_MYANMAR && ch != Validator::kZeroWidthJoiner && - ch != Validator::kZeroWidthNonJoiner) - return true; - return (0x1040 <= ch && ch <= 0x1049) || (0x1090 <= ch && ch <= 0x1099) || - (0x109c <= ch && ch <= 0x109d) || (0xa9f0 <= ch && ch <= 0xa9f9) || - (0xaa74 <= ch && ch <= 0xaa79); -} - -} // namespace tesseract +#include "validate_myanmar.h" +#include "errcode.h" +#include "icuerrorcode.h" +#include "tprintf.h" +#include "unicode/uchar.h" // From libicu +#include "unicode/uscript.h" // From libicu + +namespace tesseract { + +// Returns whether codes matches the pattern for a Myanmar Grapheme. +// Taken directly from the unicode table 16-3. +// See http://www.unicode.org/versions/Unicode9.0.0/ch16.pdf +bool ValidateMyanmar::ConsumeGraphemeIfValid() { + int num_codes = codes_.size(); + if (codes_used_ == num_codes) return true; + // Other. + if (IsMyanmarOther(codes_[codes_used_].second)) { + UseMultiCode(1); + return true; + } + // Kinzi. + if (codes_used_ + 2 < num_codes && codes_[codes_used_].second == 0x1004 && + codes_[codes_used_ + 1].second == kMyanmarAsat && + codes_[codes_used_ + 2].second == kMyanmarVirama) { + ASSERT_HOST(!CodeOnlyToOutput()); + ASSERT_HOST(!CodeOnlyToOutput()); + if (UseMultiCode(3)) return true; + } + // Base consonant/vowel. NOTE that since everything in Myanmar appears to be + // optional, except the base, this is the only place where invalid input can + // be detected and false returned. + if (IsMyanmarLetter(codes_[codes_used_].second)) { + if (UseMultiCode(1)) return true; + } else { + if (report_errors_) { + tprintf("Invalid start of Myanmar syllable:0x%x\n", + codes_[codes_used_].second); + } + return false; // One of these is required. + } + if (ConsumeSubscriptIfPresent()) return true; + ConsumeOptionalSignsIfPresent(); + // What we have consumed so far is a valid syllable. + return true; +} + +// TODO(rays) Doesn't use intermediate coding like the other scripts, as there +// is little correspondence between the content of table 16-3 and the char +// classes of the Indic languages. (Experts may disagree and improve!) +// In unicode table 16-3 there is basically a long list of optional characters, +// which can be coded quite easily. +// Unfortunately, table 16-3 doesn't include even half the Myanmar unicodes!! +// The table also allows sequences that still result in dotted circles!! +// So with a lot of guesswork the rest have been added in a reasonable place. +Validator::CharClass ValidateMyanmar::UnicodeToCharClass(char32 ch) const { + if (IsMyanmarLetter(ch)) return CharClass::kConsonant; + return CharClass::kOther; +} + +// Helper consumes/copies a virama and any subscript consonant. +// Returns true if the end of input is reached. +bool ValidateMyanmar::ConsumeSubscriptIfPresent() { + // Subscript consonant. It appears there can be only one. + int num_codes = codes_.size(); + if (codes_used_ + 1 < num_codes && + codes_[codes_used_].second == kMyanmarVirama) { + if (IsMyanmarLetter(codes_[codes_used_ + 1].second)) { + ASSERT_HOST(!CodeOnlyToOutput()); + if (UseMultiCode(2)) return true; + } + } + return false; +} + +// Helper consumes/copies a series of optional signs. +// Returns true if the end of input is reached. +bool ValidateMyanmar::ConsumeOptionalSignsIfPresent() { + // The following characters are allowed, all optional, and in sequence. + // An exception is kMyanmarMedialYa, which can include kMyanmarAsat. + const std::vector kMedials({kMyanmarAsat, kMyanmarMedialYa, 0x103c, + 0x103d, 0x103e, 0x105e, 0x105f, 0x1060, + 0x1081, 0x1031}); + for (char32 ch : kMedials) { + if (codes_[codes_used_].second == ch) { + if (UseMultiCode(1)) return true; + if (ch == kMyanmarMedialYa && + codes_[codes_used_].second == kMyanmarAsat) { + if (UseMultiCode(1)) return true; + } + } + } + // Vowel sign i, ii, ai. + char32 ch = codes_[codes_used_].second; + if (ch == 0x102d || ch == 0x102e || ch == 0x1032) { + if (UseMultiCode(1)) return true; + } + // Vowel sign u, uu, and extensions. + ch = codes_[codes_used_].second; + if (ch == 0x102f || ch == 0x1030 || (0x1056 <= ch && ch <= 0x1059) || + ch == 0x1062 || ch == 0x1067 || ch == 0x1068 || + (0x1071 <= ch && ch <= 0x1074) || (0x1083 <= ch && ch <= 0x1086) || + ch == 0x109c || ch == 0x109d) { + if (UseMultiCode(1)) return true; + } + // Tall aa, aa with optional asat. + if (codes_[codes_used_].second == 0x102b || + codes_[codes_used_].second == 0x102c) { + if (UseMultiCode(1)) return true; + if (codes_[codes_used_].second == kMyanmarAsat) { + if (UseMultiCode(1)) return true; + } + } + // The following characters are allowed, all optional, and in sequence. + const std::vector kSigns({0x1036, 0x1037}); + for (char32 ch : kSigns) { + if (codes_[codes_used_].second == ch) { + if (UseMultiCode(1)) return true; + } + } + // Tone mark extensions. + ch = codes_[codes_used_].second; + if (ch == 0x1038 || ch == kMyanmarAsat || ch == 0x1063 || ch == 0x1064 || + (0x1069 <= ch && ch <= 0x106d) || (0x1087 <= ch && ch <= 0x108d) || + ch == 0x108f || ch == 0x109a || ch == 0x109b || + (0xaa7b <= ch && ch <= 0xaa7d)) { + if (UseMultiCode(1)) return true; + } + return false; +} + +// Returns true if the unicode is a Myanmar "letter" including consonants +// and independent vowels. Although table 16-3 distinguishes between some +// base consonants and vowels, the extensions make no such distinction, so we +// put them all into a single bucket. +/* static */ +bool ValidateMyanmar::IsMyanmarLetter(char32 ch) { + return (0x1000 <= ch && ch <= 0x102a) || ch == 0x103f || + (0x1050 <= ch && ch <= 0x1055) || (0x105a <= ch && ch <= 0x105d) || + ch == 0x1061 || ch == 0x1065 || ch == 0x1066 || + (0x106e <= ch && ch <= 0x1070) || (0x1075 <= ch && ch <= 0x1080) || + ch == 0x108e || (0xa9e0 <= ch && ch <= 0xa9ef) || + (0xa9fa <= ch && ch <= 0xa9ff) || (0xaa60 <= ch && ch <= 0xaa73) || + ch == 0xaa7a || ch == 0xaa7e || ch == 0xaa7f; +} + +// Returns true if ch is a Myanmar digit or other symbol that does not take +// part in being a syllable. +/* static */ +bool ValidateMyanmar::IsMyanmarOther(char32 ch) { + IcuErrorCode err; + UScriptCode script_code = uscript_getScript(ch, err); + if (script_code != USCRIPT_MYANMAR && ch != Validator::kZeroWidthJoiner && + ch != Validator::kZeroWidthNonJoiner) + return true; + return (0x1040 <= ch && ch <= 0x1049) || (0x1090 <= ch && ch <= 0x1099) || + (0x109c <= ch && ch <= 0x109d) || (0xa9f0 <= ch && ch <= 0xa9f9) || + (0xaa74 <= ch && ch <= 0xaa79); +} + +} // namespace tesseract diff --git a/src/training/validate_myanmar.h b/src/training/validate_myanmar.h index 97cb480007..d2ada74505 100644 --- a/src/training/validate_myanmar.h +++ b/src/training/validate_myanmar.h @@ -1,47 +1,47 @@ -#ifndef TESSERACT_TRAINING_VALIDATE_MYANMAR_H_ -#define TESSERACT_TRAINING_VALIDATE_MYANMAR_H_ - -#include "validator.h" - -namespace tesseract { - -// Subclass of Validator that validates and segments Myanmar. -class ValidateMyanmar : public Validator { - public: - ValidateMyanmar(ViramaScript script, bool report_errors) - : Validator(script, report_errors) {} - ~ValidateMyanmar() {} - - protected: - // Returns whether codes matches the pattern for a Myanmar Grapheme. - // Consumes the next Grapheme in codes_[codes_used_++...] and copies it to - // parts_ and output_. Returns true if a valid Grapheme was consumed, - // otherwise does not increment codes_used_. - bool ConsumeGraphemeIfValid() override; - // Returns the CharClass corresponding to the given Unicode ch. - Validator::CharClass UnicodeToCharClass(char32 ch) const override; - - private: - // Helper consumes/copies a virama and any subscript consonant. - // Returns true if the end of input is reached. - bool ConsumeSubscriptIfPresent(); - // Helper consumes/copies a series of optional signs. - // Returns true if the end of input is reached. - bool ConsumeOptionalSignsIfPresent(); - // Returns true if the unicode is a Myanmar "letter" including consonants - // and independent vowels. Although table 16-3 distinguishes between some - // base consonants and vowels, the extensions make no such distinction, so we - // put them all into a single bucket. - static bool IsMyanmarLetter(char32 ch); - // Returns true if ch is a Myanmar digit or other symbol that does not take - // part in being a syllable. - static bool IsMyanmarOther(char32 ch); - - // Some special unicodes used only for Myanmar processing. - static const char32 kMyanmarAsat = 0x103a; - static const char32 kMyanmarMedialYa = 0x103b; -}; - -} // namespace tesseract - -#endif // TESSERACT_TRAINING_VALIDATE_MYANMAR_H_ +#ifndef TESSERACT_TRAINING_VALIDATE_MYANMAR_H_ +#define TESSERACT_TRAINING_VALIDATE_MYANMAR_H_ + +#include "validator.h" + +namespace tesseract { + +// Subclass of Validator that validates and segments Myanmar. +class ValidateMyanmar : public Validator { + public: + ValidateMyanmar(ViramaScript script, bool report_errors) + : Validator(script, report_errors) {} + ~ValidateMyanmar() {} + + protected: + // Returns whether codes matches the pattern for a Myanmar Grapheme. + // Consumes the next Grapheme in codes_[codes_used_++...] and copies it to + // parts_ and output_. Returns true if a valid Grapheme was consumed, + // otherwise does not increment codes_used_. + bool ConsumeGraphemeIfValid() override; + // Returns the CharClass corresponding to the given Unicode ch. + Validator::CharClass UnicodeToCharClass(char32 ch) const override; + + private: + // Helper consumes/copies a virama and any subscript consonant. + // Returns true if the end of input is reached. + bool ConsumeSubscriptIfPresent(); + // Helper consumes/copies a series of optional signs. + // Returns true if the end of input is reached. + bool ConsumeOptionalSignsIfPresent(); + // Returns true if the unicode is a Myanmar "letter" including consonants + // and independent vowels. Although table 16-3 distinguishes between some + // base consonants and vowels, the extensions make no such distinction, so we + // put them all into a single bucket. + static bool IsMyanmarLetter(char32 ch); + // Returns true if ch is a Myanmar digit or other symbol that does not take + // part in being a syllable. + static bool IsMyanmarOther(char32 ch); + + // Some special unicodes used only for Myanmar processing. + static const char32 kMyanmarAsat = 0x103a; + static const char32 kMyanmarMedialYa = 0x103b; +}; + +} // namespace tesseract + +#endif // TESSERACT_TRAINING_VALIDATE_MYANMAR_H_ diff --git a/src/training/validator.h b/src/training/validator.h index 0289544fbe..6b21daa911 100644 --- a/src/training/validator.h +++ b/src/training/validator.h @@ -1,243 +1,243 @@ -/********************************************************************** - * File: validator.h - * Description: Base class for various text validators. Intended mainly for - * scripts that use a virama character. - * Author: Ray Smith - * Created: Tue May 23 2017 - * - * (C) Copyright 2017, Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - **********************************************************************/ - -#ifndef TESSERACT_TRAINING_VALIDATOR_H_ -#define TESSERACT_TRAINING_VALIDATOR_H_ - -#include -#include -#include "unichar.h" - -namespace tesseract { - -// Different kinds of grapheme normalization - not just for Indic! -// A grapheme is a syllable unit in Indic and can be several unicodes. -// In other scripts, a grapheme is a base character and accent/diacritic -// combination, as not all accented characters have a single composed form. -enum class GraphemeNormMode { - // Validation result is a single string, even if input is multi-word. - kSingleString, - // Standard unicode graphemes are validated and output as grapheme units. - kCombined, - // Graphemes are validated and sub-divided. For virama-using scripts, units - // that correspond to repeatable glyphs are generated. (Mostly single unicodes - // but viramas and joiners are paired with the most sensible neighbor.) - // For non-virama scripts, this means that base/accent pairs are separated, - // ie the output is individual unicodes. - kGlyphSplit, - // The output is always single unicodes, regardless of the script. - kIndividualUnicodes, -}; - -// An enum representing the scripts that use a virama character. It is -// guaranteed that the value of any element, (except kNonVirama) can be cast -// to a unicode (char32) value that represents the start of the unicode range -// of the corresponding script. -enum class ViramaScript : char32 { - kNonVirama = 0, - kDevanagari = 0x900, - kBengali = 0x980, - kGurmukhi = 0xa00, - kGujarati = 0xa80, - kOriya = 0xb00, - kTamil = 0xb80, - kTelugu = 0xc00, - kKannada = 0xc80, - kMalayalam = 0xd00, - kSinhala = 0xd80, - kMyanmar = 0x1000, - kKhmer = 0x1780, -}; - -// Base class offers a validation API and protected methods to allow subclasses -// to easily build the validated/segmented output. -class Validator { - public: - // Validates and cleans the src vector of unicodes to the *dest, according to - // g_mode. In the case of kSingleString, a single vector containing the whole - // result is added to *dest. With kCombined, multiple vectors are added to - // *dest with one grapheme in each. With kGlyphSplit, multiple vectors are - // added to *dest with a smaller unit representing a glyph in each. - // In case of validation error, returns false and as much as possible of the - // input, without discarding invalid text. - static bool ValidateCleanAndSegment(GraphemeNormMode g_mode, - bool report_errors, - const std::vector& src, - std::vector>* dest); - - // Returns true if the unicode ch is a non-printing zero-width mark of no - // significance to OCR training or evaluation. - static bool IsZeroWidthMark(char32 ch) { - return ch == kZeroWidthSpace || ch == kLeftToRightMark || - ch == kRightToLeftMark || ch == kInvalid; - } - virtual ~Validator() {} - - // Some specific but universally useful unicodes. - static const char32 kZeroWidthSpace; - static const char32 kZeroWidthNonJoiner; - static const char32 kZeroWidthJoiner; - static const char32 kLeftToRightMark; - static const char32 kRightToLeftMark; - static const char32 kInvalid; - - protected: - // These are more or less the character class identifiers in the ISCII - // standard, section 8. They have been augmented with the Unicode meta - // characters Zero Width Joiner and Zero Width Non Joiner, and the - // Unicode Vedic Marks. - // The best sources of information on Unicode and Indic scripts are: - // http://varamozhi.sourceforge.net/iscii91.pdf - // http://www.unicode.org/versions/Unicode9.0.0/ch12.pdf - // http://unicode.org/faq/indic.html - // http://www.microsoft.com/typography/otfntdev/teluguot/shaping.aspx - enum class CharClass { - // NOTE: The values of the enum members are meaningless and arbitrary, ie - // they are not used for sorting, or any other risky application. - // The reason they are what they are is they are a single character - // abbreviation that can be used in a regexp/BNF definition of a grammar, - // IN A COMMENT, and still not relied upon in the code. - kConsonant = 'C', - kVowel = 'V', - kVirama = 'H', // (aka Halant) - kMatra = 'M', // (aka Dependent Vowel) - kMatraPiece = 'P', // unicode provides pieces of Matras. - kVowelModifier = 'D', // (candrabindu, anusvara, visarga, other marks) - kZeroWidthNonJoiner = 'z', // Unicode Zero Width Non-Joiner U+200C - kZeroWidthJoiner = 'Z', // Unicode Zero Width Joiner U+200D - kVedicMark = 'v', // Modifiers can come modify any indic syllable. - kNukta = 'N', // Occurs only immediately after consonants. - kRobat = 'R', // Khmer only. - kOther = 'O', // (digits, measures, non-Indic, etc) - // Additional classes used only by ValidateGrapheme. - kWhitespace = ' ', - kCombiner = 'c', // Combiners other than virama. - }; - typedef std::pair IndicPair; - - Validator(ViramaScript script, bool report_errors) - : script_(script), - codes_used_(0), - output_used_(0), - report_errors_(report_errors) {} - - // Factory method that understands how to map script to the right subclass. - static std::unique_ptr ScriptValidator(ViramaScript script, - bool report_errors); - - // Internal version of the public static ValidateCleanAndSegment. - // Validates and cleans the src vector of unicodes to the *dest, according to - // its type and the given g_mode. - // In case of validation error, returns false and returns as much as possible - // of the input, without discarding invalid text. - bool ValidateCleanAndSegmentInternal(GraphemeNormMode g_mode, - const std::vector& src, - std::vector>* dest); - // Moves the results from parts_ or output_ to dest according to g_mode. - void MoveResultsToDest(GraphemeNormMode g_mode, - std::vector>* dest); - - // Computes and returns the ViramaScript corresponding to the most frequent - // virama-using script in the input, or kNonVirama if none are present. - static ViramaScript MostFrequentViramaScript( - const std::vector& utf32); - // Returns true if the given UTF-32 unicode is a "virama" character. - static bool IsVirama(char32 unicode); - // Returns true if the given UTF-32 unicode is a vedic accent. - static bool IsVedicAccent(char32 unicode); - // Returns true if the script is one that uses subscripts for conjuncts. - bool IsSubscriptScript() const; - - // Helper function appends the next element of codes_ only to output_, - // without touching parts_ - // Returns true at the end of codes_. - bool CodeOnlyToOutput() { - output_.push_back(codes_[codes_used_].second); - return ++codes_used_ == codes_.size(); - } - - // Helper function adds a length-element vector to parts_ from the last length - // elements of output_. If there are more than length unused elements in - // output_, adds unicodes as single-element vectors to parts_ to catch - // output_used_ up to output->size() - length before adding the length-element - // vector. - void MultiCodePart(int length) { - while (output_used_ + length < output_.size()) { - parts_.emplace_back( - std::initializer_list{output_[output_used_++]}); - } - parts_.emplace_back(std::initializer_list{output_[output_used_]}); - while (++output_used_ < output_.size()) { - parts_.back().push_back(output_[output_used_]); - } - } - - // Helper function appends the next element of codes_ to output_, and then - // calls MultiCodePart to add the appropriate components to parts_. - // Returns true at the end of codes_. - bool UseMultiCode(int length) { - output_.push_back(codes_[codes_used_].second); - MultiCodePart(length); - return ++codes_used_ == codes_.size(); - } - - // Consumes the next Grapheme in codes_[codes_used_++...] and copies it to - // parts_ and output_. Returns true if a valid Grapheme was consumed, - // otherwise does not increment codes_used_. - virtual bool ConsumeGraphemeIfValid() = 0; - // Sets codes_ to the class codes for the given unicode text. - void ComputeClassCodes(const std::vector& text); - // Returns the CharClass corresponding to the given Unicode ch. - virtual CharClass UnicodeToCharClass(char32 ch) const = 0; - // Resets to the initial state. - void Clear(); - - // Number of unicodes in each Indic codepage. - static const int kIndicCodePageSize = 128; - // Lowest unicode value of any Indic script. (Devanagari). - static const char32 kMinIndicUnicode = 0x900; - // Highest unicode value of any consistent (ISCII-based) Indic script. - static const char32 kMaxSinhalaUnicode = 0xdff; - // Highest unicode value of any virama-using script. (Khmer). - static const char32 kMaxViramaScriptUnicode = 0x17ff; - // Some special unicodes. - static const char32 kSinhalaVirama = 0xdca; - static const char32 kMyanmarVirama = 0x1039; - static const char32 kKhmerVirama = 0x17d2; - - // Script we are operating on. - ViramaScript script_; - // Input unicodes with assigned CharClass is the data to be validated. - std::vector codes_; - // Glyph-like components of the input. - std::vector> parts_; - // Copied validated unicodes from codes_ that are OK to output. - std::vector output_; - // The number of elements of codes_ that have been processed so far. - int codes_used_; - // The number of elements of output_ that have already been added to parts_. - int output_used_; - // Log error messages for reasons why text is invalid. - bool report_errors_; -}; - -} // namespace tesseract - -#endif // TESSERACT_TRAINING_VALIDATOR_H_ +/********************************************************************** + * File: validator.h + * Description: Base class for various text validators. Intended mainly for + * scripts that use a virama character. + * Author: Ray Smith + * Created: Tue May 23 2017 + * + * (C) Copyright 2017, Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + **********************************************************************/ + +#ifndef TESSERACT_TRAINING_VALIDATOR_H_ +#define TESSERACT_TRAINING_VALIDATOR_H_ + +#include +#include +#include "unichar.h" + +namespace tesseract { + +// Different kinds of grapheme normalization - not just for Indic! +// A grapheme is a syllable unit in Indic and can be several unicodes. +// In other scripts, a grapheme is a base character and accent/diacritic +// combination, as not all accented characters have a single composed form. +enum class GraphemeNormMode { + // Validation result is a single string, even if input is multi-word. + kSingleString, + // Standard unicode graphemes are validated and output as grapheme units. + kCombined, + // Graphemes are validated and sub-divided. For virama-using scripts, units + // that correspond to repeatable glyphs are generated. (Mostly single unicodes + // but viramas and joiners are paired with the most sensible neighbor.) + // For non-virama scripts, this means that base/accent pairs are separated, + // ie the output is individual unicodes. + kGlyphSplit, + // The output is always single unicodes, regardless of the script. + kIndividualUnicodes, +}; + +// An enum representing the scripts that use a virama character. It is +// guaranteed that the value of any element, (except kNonVirama) can be cast +// to a unicode (char32) value that represents the start of the unicode range +// of the corresponding script. +enum class ViramaScript : char32 { + kNonVirama = 0, + kDevanagari = 0x900, + kBengali = 0x980, + kGurmukhi = 0xa00, + kGujarati = 0xa80, + kOriya = 0xb00, + kTamil = 0xb80, + kTelugu = 0xc00, + kKannada = 0xc80, + kMalayalam = 0xd00, + kSinhala = 0xd80, + kMyanmar = 0x1000, + kKhmer = 0x1780, +}; + +// Base class offers a validation API and protected methods to allow subclasses +// to easily build the validated/segmented output. +class Validator { + public: + // Validates and cleans the src vector of unicodes to the *dest, according to + // g_mode. In the case of kSingleString, a single vector containing the whole + // result is added to *dest. With kCombined, multiple vectors are added to + // *dest with one grapheme in each. With kGlyphSplit, multiple vectors are + // added to *dest with a smaller unit representing a glyph in each. + // In case of validation error, returns false and as much as possible of the + // input, without discarding invalid text. + static bool ValidateCleanAndSegment(GraphemeNormMode g_mode, + bool report_errors, + const std::vector& src, + std::vector>* dest); + + // Returns true if the unicode ch is a non-printing zero-width mark of no + // significance to OCR training or evaluation. + static bool IsZeroWidthMark(char32 ch) { + return ch == kZeroWidthSpace || ch == kLeftToRightMark || + ch == kRightToLeftMark || ch == kInvalid; + } + virtual ~Validator() {} + + // Some specific but universally useful unicodes. + static const char32 kZeroWidthSpace; + static const char32 kZeroWidthNonJoiner; + static const char32 kZeroWidthJoiner; + static const char32 kLeftToRightMark; + static const char32 kRightToLeftMark; + static const char32 kInvalid; + + protected: + // These are more or less the character class identifiers in the ISCII + // standard, section 8. They have been augmented with the Unicode meta + // characters Zero Width Joiner and Zero Width Non Joiner, and the + // Unicode Vedic Marks. + // The best sources of information on Unicode and Indic scripts are: + // http://varamozhi.sourceforge.net/iscii91.pdf + // http://www.unicode.org/versions/Unicode9.0.0/ch12.pdf + // http://unicode.org/faq/indic.html + // http://www.microsoft.com/typography/otfntdev/teluguot/shaping.aspx + enum class CharClass { + // NOTE: The values of the enum members are meaningless and arbitrary, ie + // they are not used for sorting, or any other risky application. + // The reason they are what they are is they are a single character + // abbreviation that can be used in a regexp/BNF definition of a grammar, + // IN A COMMENT, and still not relied upon in the code. + kConsonant = 'C', + kVowel = 'V', + kVirama = 'H', // (aka Halant) + kMatra = 'M', // (aka Dependent Vowel) + kMatraPiece = 'P', // unicode provides pieces of Matras. + kVowelModifier = 'D', // (candrabindu, anusvara, visarga, other marks) + kZeroWidthNonJoiner = 'z', // Unicode Zero Width Non-Joiner U+200C + kZeroWidthJoiner = 'Z', // Unicode Zero Width Joiner U+200D + kVedicMark = 'v', // Modifiers can come modify any indic syllable. + kNukta = 'N', // Occurs only immediately after consonants. + kRobat = 'R', // Khmer only. + kOther = 'O', // (digits, measures, non-Indic, etc) + // Additional classes used only by ValidateGrapheme. + kWhitespace = ' ', + kCombiner = 'c', // Combiners other than virama. + }; + typedef std::pair IndicPair; + + Validator(ViramaScript script, bool report_errors) + : script_(script), + codes_used_(0), + output_used_(0), + report_errors_(report_errors) {} + + // Factory method that understands how to map script to the right subclass. + static std::unique_ptr ScriptValidator(ViramaScript script, + bool report_errors); + + // Internal version of the public static ValidateCleanAndSegment. + // Validates and cleans the src vector of unicodes to the *dest, according to + // its type and the given g_mode. + // In case of validation error, returns false and returns as much as possible + // of the input, without discarding invalid text. + bool ValidateCleanAndSegmentInternal(GraphemeNormMode g_mode, + const std::vector& src, + std::vector>* dest); + // Moves the results from parts_ or output_ to dest according to g_mode. + void MoveResultsToDest(GraphemeNormMode g_mode, + std::vector>* dest); + + // Computes and returns the ViramaScript corresponding to the most frequent + // virama-using script in the input, or kNonVirama if none are present. + static ViramaScript MostFrequentViramaScript( + const std::vector& utf32); + // Returns true if the given UTF-32 unicode is a "virama" character. + static bool IsVirama(char32 unicode); + // Returns true if the given UTF-32 unicode is a vedic accent. + static bool IsVedicAccent(char32 unicode); + // Returns true if the script is one that uses subscripts for conjuncts. + bool IsSubscriptScript() const; + + // Helper function appends the next element of codes_ only to output_, + // without touching parts_ + // Returns true at the end of codes_. + bool CodeOnlyToOutput() { + output_.push_back(codes_[codes_used_].second); + return ++codes_used_ == codes_.size(); + } + + // Helper function adds a length-element vector to parts_ from the last length + // elements of output_. If there are more than length unused elements in + // output_, adds unicodes as single-element vectors to parts_ to catch + // output_used_ up to output->size() - length before adding the length-element + // vector. + void MultiCodePart(int length) { + while (output_used_ + length < output_.size()) { + parts_.emplace_back( + std::initializer_list{output_[output_used_++]}); + } + parts_.emplace_back(std::initializer_list{output_[output_used_]}); + while (++output_used_ < output_.size()) { + parts_.back().push_back(output_[output_used_]); + } + } + + // Helper function appends the next element of codes_ to output_, and then + // calls MultiCodePart to add the appropriate components to parts_. + // Returns true at the end of codes_. + bool UseMultiCode(int length) { + output_.push_back(codes_[codes_used_].second); + MultiCodePart(length); + return ++codes_used_ == codes_.size(); + } + + // Consumes the next Grapheme in codes_[codes_used_++...] and copies it to + // parts_ and output_. Returns true if a valid Grapheme was consumed, + // otherwise does not increment codes_used_. + virtual bool ConsumeGraphemeIfValid() = 0; + // Sets codes_ to the class codes for the given unicode text. + void ComputeClassCodes(const std::vector& text); + // Returns the CharClass corresponding to the given Unicode ch. + virtual CharClass UnicodeToCharClass(char32 ch) const = 0; + // Resets to the initial state. + void Clear(); + + // Number of unicodes in each Indic codepage. + static const int kIndicCodePageSize = 128; + // Lowest unicode value of any Indic script. (Devanagari). + static const char32 kMinIndicUnicode = 0x900; + // Highest unicode value of any consistent (ISCII-based) Indic script. + static const char32 kMaxSinhalaUnicode = 0xdff; + // Highest unicode value of any virama-using script. (Khmer). + static const char32 kMaxViramaScriptUnicode = 0x17ff; + // Some special unicodes. + static const char32 kSinhalaVirama = 0xdca; + static const char32 kMyanmarVirama = 0x1039; + static const char32 kKhmerVirama = 0x17d2; + + // Script we are operating on. + ViramaScript script_; + // Input unicodes with assigned CharClass is the data to be validated. + std::vector codes_; + // Glyph-like components of the input. + std::vector> parts_; + // Copied validated unicodes from codes_ that are OK to output. + std::vector output_; + // The number of elements of codes_ that have been processed so far. + int codes_used_; + // The number of elements of output_ that have already been added to parts_. + int output_used_; + // Log error messages for reasons why text is invalid. + bool report_errors_; +}; + +} // namespace tesseract + +#endif // TESSERACT_TRAINING_VALIDATOR_H_ diff --git a/src/viewer/Makefile.am b/src/viewer/Makefile.am index c02a2e14ff..de346a98c1 100644 --- a/src/viewer/Makefile.am +++ b/src/viewer/Makefile.am @@ -1,14 +1,14 @@ -AM_CPPFLAGS += -I$(top_srcdir)/ccutil - -if VISIBILITY -AM_CPPFLAGS += -DTESS_EXPORTS \ - -fvisibility=hidden -fvisibility-inlines-hidden -endif - -noinst_HEADERS = \ - scrollview.h svmnode.h svutil.h - -noinst_LTLIBRARIES = libtesseract_viewer.la - -libtesseract_viewer_la_SOURCES = \ - scrollview.cpp svmnode.cpp svutil.cpp svpaint.cpp +AM_CPPFLAGS += -I$(top_srcdir)/ccutil + +if VISIBILITY +AM_CPPFLAGS += -DTESS_EXPORTS \ + -fvisibility=hidden -fvisibility-inlines-hidden +endif + +noinst_HEADERS = \ + scrollview.h svmnode.h svutil.h + +noinst_LTLIBRARIES = libtesseract_viewer.la + +libtesseract_viewer_la_SOURCES = \ + scrollview.cpp svmnode.cpp svutil.cpp svpaint.cpp diff --git a/src/viewer/svmnode.h b/src/viewer/svmnode.h index 413dd7a831..326a88a15e 100644 --- a/src/viewer/svmnode.h +++ b/src/viewer/svmnode.h @@ -1,96 +1,96 @@ -/////////////////////////////////////////////////////////////////////// -// File: svmnode.h -// description_: ScrollView Menu Node -// Author: Joern Wanke -// Created: Thu Nov 29 2007 -// -// (C) Copyright 2007, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// -// -// A SVMenuNode is an entity which contains the mapping from a menu entry on -// the server side to the corresponding associated commands on the client. -// It is designed to be a tree structure with a root node, which can then be -// used to generate the appropriate messages to the server to display the -// menu structure there. -// A SVMenuNode can both be used in the context_ of popup menus as well as -// menu bars. - -#ifndef TESSERACT_VIEWER_SVMNODE_H_ -#define TESSERACT_VIEWER_SVMNODE_H_ - -#include "strngs.h" - -class ScrollView; - -class SVMenuNode { - public: - // Creating the (empty) root menu node. - SVMenuNode(); - - // Destructor for every node. - ~SVMenuNode(); - - // Create a new sub menu node with just a caption. This is used to create - // nodes which act as parent nodes to other nodes (e.g. submenus). - SVMenuNode* AddChild(const char* txt); - - // Create a "normal" menu node which is associated with a command event. - void AddChild(const char* txt, int command_event); - - // Create a flag menu node. - void AddChild(const char* txt, int command_event, int tv); - - // Create a menu node with an associated value (which might be changed - // through the gui). - void AddChild(const char* txt, int command_event, const char* val); - - // Create a menu node with an associated value and description_. - void AddChild(const char* txt, int command_event, - const char* val, const char* desc); - - // Build a menu structure for the server and send the necessary messages. - // Should be called on the root node. If menu_bar is true, a menu_bar menu - // is built (e.g. on top of the window), if it is false a popup menu is - // built which gets shown by right clicking on the window. - void BuildMenu(ScrollView *sv, bool menu_bar = true); - - private: - // Constructor holding the actual node data. - SVMenuNode(int command_event, const char* txt, int tv, - bool check_box_entry, const char* val, const char* desc); - - // Adds a new menu node to the current node. - void AddChild(SVMenuNode* svmn); - - // The parent node of this node. - SVMenuNode* parent_; - // The first child of this node. - SVMenuNode* child_; - // The next "sibling" of this node (e.g. same parent). - SVMenuNode* next_; - // Whether this menu node actually is a flag. - bool is_check_box_entry_; - - // The command event associated with a specific menu node. Should be unique. - int cmd_event_; - // The caption associated with a specific menu node. - STRING text_; - // The value of the flag (if this menu node is a flag). - bool toggle_value_; - // The value of the menu node. (optional) - STRING value_; - // A description_ of the value. (optional) - STRING description_; -}; - -#endif // TESSERACT_VIEWER_SVMNODE_H_ +/////////////////////////////////////////////////////////////////////// +// File: svmnode.h +// description_: ScrollView Menu Node +// Author: Joern Wanke +// Created: Thu Nov 29 2007 +// +// (C) Copyright 2007, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// +// +// A SVMenuNode is an entity which contains the mapping from a menu entry on +// the server side to the corresponding associated commands on the client. +// It is designed to be a tree structure with a root node, which can then be +// used to generate the appropriate messages to the server to display the +// menu structure there. +// A SVMenuNode can both be used in the context_ of popup menus as well as +// menu bars. + +#ifndef TESSERACT_VIEWER_SVMNODE_H_ +#define TESSERACT_VIEWER_SVMNODE_H_ + +#include "strngs.h" + +class ScrollView; + +class SVMenuNode { + public: + // Creating the (empty) root menu node. + SVMenuNode(); + + // Destructor for every node. + ~SVMenuNode(); + + // Create a new sub menu node with just a caption. This is used to create + // nodes which act as parent nodes to other nodes (e.g. submenus). + SVMenuNode* AddChild(const char* txt); + + // Create a "normal" menu node which is associated with a command event. + void AddChild(const char* txt, int command_event); + + // Create a flag menu node. + void AddChild(const char* txt, int command_event, int tv); + + // Create a menu node with an associated value (which might be changed + // through the gui). + void AddChild(const char* txt, int command_event, const char* val); + + // Create a menu node with an associated value and description_. + void AddChild(const char* txt, int command_event, + const char* val, const char* desc); + + // Build a menu structure for the server and send the necessary messages. + // Should be called on the root node. If menu_bar is true, a menu_bar menu + // is built (e.g. on top of the window), if it is false a popup menu is + // built which gets shown by right clicking on the window. + void BuildMenu(ScrollView *sv, bool menu_bar = true); + + private: + // Constructor holding the actual node data. + SVMenuNode(int command_event, const char* txt, int tv, + bool check_box_entry, const char* val, const char* desc); + + // Adds a new menu node to the current node. + void AddChild(SVMenuNode* svmn); + + // The parent node of this node. + SVMenuNode* parent_; + // The first child of this node. + SVMenuNode* child_; + // The next "sibling" of this node (e.g. same parent). + SVMenuNode* next_; + // Whether this menu node actually is a flag. + bool is_check_box_entry_; + + // The command event associated with a specific menu node. Should be unique. + int cmd_event_; + // The caption associated with a specific menu node. + STRING text_; + // The value of the flag (if this menu node is a flag). + bool toggle_value_; + // The value of the menu node. (optional) + STRING value_; + // A description_ of the value. (optional) + STRING description_; +}; + +#endif // TESSERACT_VIEWER_SVMNODE_H_ diff --git a/src/viewer/svpaint.cpp b/src/viewer/svpaint.cpp index 851f9b8973..1ed12bd32f 100644 --- a/src/viewer/svpaint.cpp +++ b/src/viewer/svpaint.cpp @@ -1,235 +1,235 @@ -// Copyright 2007 Google Inc. All Rights Reserved. -// -// Author: Joern Wanke -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// Simple drawing program to illustrate ScrollView capabilities. -// -// Functionality: -// - The menubar is used to select from different sample styles of input. -// - With the RMB it is possible to change the RGB values in different -// popup menus. -// - A LMB click either draws point-to-point, point or text. -// - A LMB dragging either draws a line, a rectangle or ellipse. - -// Include automatically generated configuration file if running autoconf. -#ifdef HAVE_CONFIG_H -#include "config_auto.h" -#endif - -#ifndef GRAPHICS_DISABLED -#include "scrollview.h" -#include "svmnode.h" -#include -#include - -// The current color values we use, initially white (== ScrollView::WHITE). -int rgb[3] = { 255, 255, 255 }; - -class SVPaint : public SVEventHandler { - public: - explicit SVPaint(const char* server_name); -// This is the main event handling function that we need to overwrite, defined -// in SVEventHandler. - void Notify(const SVEvent* sv_event); - private: -// The Handler take care of the SVET_POPUP, SVET_MENU, SVET_CLICK and -// SVET_SELECTION events. - void PopupHandler(const SVEvent* sv_event); - void MenuBarHandler(const SVEvent* sv_event); - void ClickHandler(const SVEvent* sv_event); - void SelectionHandler(const SVEvent* sv_event); - -// Convenience functions to build little menus. - SVMenuNode* BuildPopupMenu(); - SVMenuNode* BuildMenuBar(); - -// Our window. - ScrollView* window_; - -// The mode we are in when an SVET_CLICK or an SVET_SELECTION event occurs. - int click_mode_; - int drag_mode_; - -// In the point-to-point drawing mode, we need to set a start-point the first -// time we call it (e.g. call SetCursor). - bool has_start_point_; -}; - -// Build a sample popup menu. -SVMenuNode* SVPaint::BuildPopupMenu() { - SVMenuNode* root = new SVMenuNode(); // Empty root node - // Initial color is white, so we all values to 255. - root->AddChild("R", // Shown caption. - 1, // assoc. command_id. - "255", // initial value. - "Red Color Value?"); // Shown description. - root->AddChild("G", 2, "255", "Green Color Value?"); - root->AddChild("B", 3, "255", "Blue Color Value?"); - return root; -} - -// Build a sample menu bar. -SVMenuNode* SVPaint::BuildMenuBar() { - SVMenuNode* root = new SVMenuNode(); // Empty root node - - // Create some submenus and add them to the root. - SVMenuNode* click = root->AddChild("Clicking"); - SVMenuNode* drag = root->AddChild("Dragging"); - - // Put some nodes into the submenus. - click->AddChild("Point to Point Drawing", // Caption. - 1); // command_id. - click->AddChild("Point Drawing", 2); - click->AddChild("Text Drawing", 3); - drag->AddChild("Line Drawing", 4); - drag->AddChild("Rectangle Drawing", 5); - drag->AddChild("Ellipse Drawing", 6); - return root; -} - -// Takes care of the SVET_POPUP events. -// In our case, SVET_POPUP is used to set RGB values. -void SVPaint::PopupHandler(const SVEvent* sv_event) { - // Since we only have the RGB values as popup items, - // we take a shortcut to not bloat up code: - rgb[sv_event->command_id - 1] = atoi(sv_event->parameter); - window_->Pen(rgb[0], rgb[1], rgb[2]); -} - -// Takes care of the SVET_MENU events. -// In our case, we change either the click_mode_ (commands 1-3) -// or the drag_mode_ (commands 4-6). -void SVPaint::MenuBarHandler(const SVEvent* sv_event) { - if ((sv_event->command_id > 0) && (sv_event->command_id < 4)) { - click_mode_ = sv_event->command_id; - has_start_point_ = false; - } else { drag_mode_ = sv_event->command_id; } -} - -// Takes care of the SVET_CLICK events. -// Depending on the click_mode_ we are in, either do Point-to-Point drawing, -// point drawing, or draw text. -void SVPaint::ClickHandler(const SVEvent* sv_event) { - switch (click_mode_) { - case 1: //Point to Point - if (has_start_point_) { window_->DrawTo(sv_event->x, sv_event->y); - } else { - has_start_point_ = true; - window_->SetCursor(sv_event->x, sv_event->y); - } - break; - case 2: //Point Drawing..simulated by drawing a 1 pixel line. - window_->Line(sv_event->x, sv_event->y, sv_event->x, sv_event->y); - break; - case 3: //Text - // We show a modal input dialog on our window, then draw the input and - // finally delete the input pointer. - char* p = window_->ShowInputDialog("Text:"); - window_->Text(sv_event->x, sv_event->y, p); - delete [] p; - break; - } -} - -// Takes care of the SVET_SELECTION events. -// Depending on the drag_mode_ we are in, either draw a line, a rectangle or -// an ellipse. -void SVPaint::SelectionHandler(const SVEvent* sv_event) { - switch (drag_mode_) { - //FIXME inversed x_size, y_size - case 4: //Line - window_->Line(sv_event->x, sv_event->y, - sv_event->x - sv_event->x_size, - sv_event->y - sv_event->y_size); - break; - case 5: //Rectangle - window_->Rectangle(sv_event->x, sv_event->y, - sv_event->x - sv_event->x_size, - sv_event->y - sv_event->y_size); - break; - case 6: //Ellipse - window_->Ellipse(sv_event->x - sv_event->x_size, - sv_event->y - sv_event->y_size, - sv_event->x_size, sv_event->y_size); - break; - } -} - -// The event handling function from ScrollView which we have to overwrite. -// We handle CLICK, SELECTION, MENU and POPUP and throw away all other events. -void SVPaint::Notify(const SVEvent* sv_event) { - if (sv_event->type == SVET_CLICK) { ClickHandler(sv_event); } - else if (sv_event->type == SVET_SELECTION) { SelectionHandler(sv_event); } - else if (sv_event->type == SVET_MENU) { MenuBarHandler(sv_event); } - else if (sv_event->type == SVET_POPUP) { PopupHandler(sv_event); } - else {} //throw other events away -} - -// Builds a new window, initializes the variables and event handler and builds -// the menu. -SVPaint::SVPaint(const char *server_name) { - window_ = new ScrollView("ScrollView Paint Example", // window caption - 0, 0, // x,y window position - 500, 500, // window size - 500, 500, // canvas size - false, // whether the Y axis is inversed. - // this is included due to legacy - // reasons for tesseract and enables - // us to have (0,0) as the LOWER left - // of the coordinate system. - server_name); // the server address. - - // Set the start modes to point-to-point and line drawing. - click_mode_ = 1; - drag_mode_ = 4; - has_start_point_ = false; - - // Bild our menus and add them to the window. The flag illustrates whether - // this is a menu bar. - SVMenuNode* popup_menu = BuildPopupMenu(); - popup_menu->BuildMenu(window_,false); - - SVMenuNode* bar_menu = BuildMenuBar(); - bar_menu->BuildMenu(window_,true); - - // Set the initial color values to White (could also be done by - // passing (rgb[0], rgb[1], rgb[2]). - window_->Pen(ScrollView::WHITE); - window_->Brush(ScrollView::WHITE); - - // Adds the event handler to the window. This actually ensures that Notify - // gets called when events occur. - window_->AddEventHandler(this); - - // Set the window visible (calling this is important to actually render - // everything. Without this call, the window would also be drawn, but the - // menu bars would be missing. - window_->SetVisible(true); - - // Rest this thread until its window is destroyed. - // Note that a special eventhandling thread was created when constructing - // the window. Due to this, the application will not deadlock here. - window_->AwaitEvent(SVET_DESTROY); - // We now have 3 Threads running: - // (1) The MessageReceiver thread which fetches messages and distributes them - // (2) The EventHandler thread which handles all events for window_ - // (3) The main thread which waits on window_ for a DESTROY event (blocked) -} - -// If a parameter is given, we try to connect to the given server. -// This enables us to test the remote capabilites of ScrollView. -int main(int argc, char** argv) { - const char* server_name; - if (argc > 1) { server_name = argv[1]; } else { server_name = "localhost"; } - SVPaint svp(server_name); -} -#endif // GRAPHICS_DISABLED +// Copyright 2007 Google Inc. All Rights Reserved. +// +// Author: Joern Wanke +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Simple drawing program to illustrate ScrollView capabilities. +// +// Functionality: +// - The menubar is used to select from different sample styles of input. +// - With the RMB it is possible to change the RGB values in different +// popup menus. +// - A LMB click either draws point-to-point, point or text. +// - A LMB dragging either draws a line, a rectangle or ellipse. + +// Include automatically generated configuration file if running autoconf. +#ifdef HAVE_CONFIG_H +#include "config_auto.h" +#endif + +#ifndef GRAPHICS_DISABLED +#include "scrollview.h" +#include "svmnode.h" +#include +#include + +// The current color values we use, initially white (== ScrollView::WHITE). +int rgb[3] = { 255, 255, 255 }; + +class SVPaint : public SVEventHandler { + public: + explicit SVPaint(const char* server_name); +// This is the main event handling function that we need to overwrite, defined +// in SVEventHandler. + void Notify(const SVEvent* sv_event); + private: +// The Handler take care of the SVET_POPUP, SVET_MENU, SVET_CLICK and +// SVET_SELECTION events. + void PopupHandler(const SVEvent* sv_event); + void MenuBarHandler(const SVEvent* sv_event); + void ClickHandler(const SVEvent* sv_event); + void SelectionHandler(const SVEvent* sv_event); + +// Convenience functions to build little menus. + SVMenuNode* BuildPopupMenu(); + SVMenuNode* BuildMenuBar(); + +// Our window. + ScrollView* window_; + +// The mode we are in when an SVET_CLICK or an SVET_SELECTION event occurs. + int click_mode_; + int drag_mode_; + +// In the point-to-point drawing mode, we need to set a start-point the first +// time we call it (e.g. call SetCursor). + bool has_start_point_; +}; + +// Build a sample popup menu. +SVMenuNode* SVPaint::BuildPopupMenu() { + SVMenuNode* root = new SVMenuNode(); // Empty root node + // Initial color is white, so we all values to 255. + root->AddChild("R", // Shown caption. + 1, // assoc. command_id. + "255", // initial value. + "Red Color Value?"); // Shown description. + root->AddChild("G", 2, "255", "Green Color Value?"); + root->AddChild("B", 3, "255", "Blue Color Value?"); + return root; +} + +// Build a sample menu bar. +SVMenuNode* SVPaint::BuildMenuBar() { + SVMenuNode* root = new SVMenuNode(); // Empty root node + + // Create some submenus and add them to the root. + SVMenuNode* click = root->AddChild("Clicking"); + SVMenuNode* drag = root->AddChild("Dragging"); + + // Put some nodes into the submenus. + click->AddChild("Point to Point Drawing", // Caption. + 1); // command_id. + click->AddChild("Point Drawing", 2); + click->AddChild("Text Drawing", 3); + drag->AddChild("Line Drawing", 4); + drag->AddChild("Rectangle Drawing", 5); + drag->AddChild("Ellipse Drawing", 6); + return root; +} + +// Takes care of the SVET_POPUP events. +// In our case, SVET_POPUP is used to set RGB values. +void SVPaint::PopupHandler(const SVEvent* sv_event) { + // Since we only have the RGB values as popup items, + // we take a shortcut to not bloat up code: + rgb[sv_event->command_id - 1] = atoi(sv_event->parameter); + window_->Pen(rgb[0], rgb[1], rgb[2]); +} + +// Takes care of the SVET_MENU events. +// In our case, we change either the click_mode_ (commands 1-3) +// or the drag_mode_ (commands 4-6). +void SVPaint::MenuBarHandler(const SVEvent* sv_event) { + if ((sv_event->command_id > 0) && (sv_event->command_id < 4)) { + click_mode_ = sv_event->command_id; + has_start_point_ = false; + } else { drag_mode_ = sv_event->command_id; } +} + +// Takes care of the SVET_CLICK events. +// Depending on the click_mode_ we are in, either do Point-to-Point drawing, +// point drawing, or draw text. +void SVPaint::ClickHandler(const SVEvent* sv_event) { + switch (click_mode_) { + case 1: //Point to Point + if (has_start_point_) { window_->DrawTo(sv_event->x, sv_event->y); + } else { + has_start_point_ = true; + window_->SetCursor(sv_event->x, sv_event->y); + } + break; + case 2: //Point Drawing..simulated by drawing a 1 pixel line. + window_->Line(sv_event->x, sv_event->y, sv_event->x, sv_event->y); + break; + case 3: //Text + // We show a modal input dialog on our window, then draw the input and + // finally delete the input pointer. + char* p = window_->ShowInputDialog("Text:"); + window_->Text(sv_event->x, sv_event->y, p); + delete [] p; + break; + } +} + +// Takes care of the SVET_SELECTION events. +// Depending on the drag_mode_ we are in, either draw a line, a rectangle or +// an ellipse. +void SVPaint::SelectionHandler(const SVEvent* sv_event) { + switch (drag_mode_) { + //FIXME inversed x_size, y_size + case 4: //Line + window_->Line(sv_event->x, sv_event->y, + sv_event->x - sv_event->x_size, + sv_event->y - sv_event->y_size); + break; + case 5: //Rectangle + window_->Rectangle(sv_event->x, sv_event->y, + sv_event->x - sv_event->x_size, + sv_event->y - sv_event->y_size); + break; + case 6: //Ellipse + window_->Ellipse(sv_event->x - sv_event->x_size, + sv_event->y - sv_event->y_size, + sv_event->x_size, sv_event->y_size); + break; + } +} + +// The event handling function from ScrollView which we have to overwrite. +// We handle CLICK, SELECTION, MENU and POPUP and throw away all other events. +void SVPaint::Notify(const SVEvent* sv_event) { + if (sv_event->type == SVET_CLICK) { ClickHandler(sv_event); } + else if (sv_event->type == SVET_SELECTION) { SelectionHandler(sv_event); } + else if (sv_event->type == SVET_MENU) { MenuBarHandler(sv_event); } + else if (sv_event->type == SVET_POPUP) { PopupHandler(sv_event); } + else {} //throw other events away +} + +// Builds a new window, initializes the variables and event handler and builds +// the menu. +SVPaint::SVPaint(const char *server_name) { + window_ = new ScrollView("ScrollView Paint Example", // window caption + 0, 0, // x,y window position + 500, 500, // window size + 500, 500, // canvas size + false, // whether the Y axis is inversed. + // this is included due to legacy + // reasons for tesseract and enables + // us to have (0,0) as the LOWER left + // of the coordinate system. + server_name); // the server address. + + // Set the start modes to point-to-point and line drawing. + click_mode_ = 1; + drag_mode_ = 4; + has_start_point_ = false; + + // Bild our menus and add them to the window. The flag illustrates whether + // this is a menu bar. + SVMenuNode* popup_menu = BuildPopupMenu(); + popup_menu->BuildMenu(window_,false); + + SVMenuNode* bar_menu = BuildMenuBar(); + bar_menu->BuildMenu(window_,true); + + // Set the initial color values to White (could also be done by + // passing (rgb[0], rgb[1], rgb[2]). + window_->Pen(ScrollView::WHITE); + window_->Brush(ScrollView::WHITE); + + // Adds the event handler to the window. This actually ensures that Notify + // gets called when events occur. + window_->AddEventHandler(this); + + // Set the window visible (calling this is important to actually render + // everything. Without this call, the window would also be drawn, but the + // menu bars would be missing. + window_->SetVisible(true); + + // Rest this thread until its window is destroyed. + // Note that a special eventhandling thread was created when constructing + // the window. Due to this, the application will not deadlock here. + window_->AwaitEvent(SVET_DESTROY); + // We now have 3 Threads running: + // (1) The MessageReceiver thread which fetches messages and distributes them + // (2) The EventHandler thread which handles all events for window_ + // (3) The main thread which waits on window_ for a DESTROY event (blocked) +} + +// If a parameter is given, we try to connect to the given server. +// This enables us to test the remote capabilites of ScrollView. +int main(int argc, char** argv) { + const char* server_name; + if (argc > 1) { server_name = argv[1]; } else { server_name = "localhost"; } + SVPaint svp(server_name); +} +#endif // GRAPHICS_DISABLED diff --git a/src/vs2010/port/gettimeofday.h b/src/vs2010/port/gettimeofday.h index 57dfce88c7..621ecd3b99 100644 --- a/src/vs2010/port/gettimeofday.h +++ b/src/vs2010/port/gettimeofday.h @@ -1,31 +1,31 @@ -/////////////////////////////////////////////////////////////////////// -// File: gettimeofday.h -// Description: Header file for gettimeofday.cpp -// Author: tomp2010, zdenop -// Created: Tue Feb 21 21:38:00 CET 2012 -// -// (C) Copyright 2012, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -#ifndef VS2008_PORT_GETTIMEOFDAY_H_ -#define VS2008_PORT_GETTIMEOFDAY_H_ - -#ifdef _WIN32 -#include // timeval is defined in here. -#endif - -typedef struct timezone tz; - -int gettimeofday(struct timeval * tp, struct timezone * tzp); - -#endif // VS2008_PORT_GETTIMEOFDAY_H_ +/////////////////////////////////////////////////////////////////////// +// File: gettimeofday.h +// Description: Header file for gettimeofday.cpp +// Author: tomp2010, zdenop +// Created: Tue Feb 21 21:38:00 CET 2012 +// +// (C) Copyright 2012, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +#ifndef VS2008_PORT_GETTIMEOFDAY_H_ +#define VS2008_PORT_GETTIMEOFDAY_H_ + +#ifdef _WIN32 +#include // timeval is defined in here. +#endif + +typedef struct timezone tz; + +int gettimeofday(struct timeval * tp, struct timezone * tzp); + +#endif // VS2008_PORT_GETTIMEOFDAY_H_ diff --git a/src/vs2010/tesseract/resource.h b/src/vs2010/tesseract/resource.h index ea8408a975..393a9e0071 100644 --- a/src/vs2010/tesseract/resource.h +++ b/src/vs2010/tesseract/resource.h @@ -1,23 +1,23 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by tesseract.rc -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 101 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by tesseract.rc +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/src/vs2010/tesseract/tesseract.rc.in b/src/vs2010/tesseract/tesseract.rc.in index 1d75922b01..b431ac9798 100644 --- a/src/vs2010/tesseract/tesseract.rc.in +++ b/src/vs2010/tesseract/tesseract.rc.in @@ -1,101 +1,101 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "windows.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION @GENERIC_MAJOR_VERSION@,@GENERIC_MINOR_VERSION@,@GENERIC_MICRO_VERSION@,0 - PRODUCTVERSION @GENERIC_MAJOR_VERSION@,@GENERIC_MINOR_VERSION@,@GENERIC_MICRO_VERSION@,0 - FILEFLAGSMASK 0x17L -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x4L - FILETYPE 0x1L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "FileDescription", "Tesseract command-line OCR engine" - VALUE "FileVersion", "@GENERIC_MAJOR_VERSION@,@GENERIC_MINOR_VERSION@,@GENERIC_MICRO_VERSION@,0" - VALUE "InternalName", "tesseract" - VALUE "LegalCopyright", "Copyright (C) 2018 Google, Inc. Licensed under the Apache License, Version 2.0" - VALUE "OriginalFilename", "tesseract.exe" - VALUE "ProductName", "Tesseract-OCR" - VALUE "ProductVersion", "@PACKAGE_VERSION@" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "windows.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION @GENERIC_MAJOR_VERSION@,@GENERIC_MINOR_VERSION@,@GENERIC_MICRO_VERSION@,0 + PRODUCTVERSION @GENERIC_MAJOR_VERSION@,@GENERIC_MINOR_VERSION@,@GENERIC_MICRO_VERSION@,0 + FILEFLAGSMASK 0x17L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "FileDescription", "Tesseract command-line OCR engine" + VALUE "FileVersion", "@GENERIC_MAJOR_VERSION@,@GENERIC_MINOR_VERSION@,@GENERIC_MICRO_VERSION@,0" + VALUE "InternalName", "tesseract" + VALUE "LegalCopyright", "Copyright (C) 2018 Google, Inc. Licensed under the Apache License, Version 2.0" + VALUE "OriginalFilename", "tesseract.exe" + VALUE "ProductName", "Tesseract-OCR" + VALUE "ProductVersion", "@PACKAGE_VERSION@" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/src/wordrec/chop.h b/src/wordrec/chop.h index 9f6890bc65..bafc99bae9 100644 --- a/src/wordrec/chop.h +++ b/src/wordrec/chop.h @@ -1,44 +1,44 @@ -/* -*-C-*- - ******************************************************************************** - * - * File: chop.h (Formerly chop.h) - * Description: - * Author: Mark Seaman, SW Productivity - * Created: Fri Oct 16 14:37:00 1987 - * Modified: Wed Jul 10 14:47:37 1991 (Mark Seaman) marks@hpgrlt - * Language: C - * Package: N/A - * Status: Reusable Software Component - * - * (c) Copyright 1987, Hewlett-Packard Company. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - *******************************************************************************/ - -#ifndef CHOP_H -#define CHOP_H - -/*---------------------------------------------------------------------- - I n c l u d e s -----------------------------------------------------------------------*/ -#include "genericheap.h" -#include "kdpair.h" -#include "seam.h" - -/*---------------------------------------------------------------------- - T y p e s ----------------------------------------------------------------------*/ -#define MAX_NUM_POINTS 50 -// The PointPair elements do NOT own the EDGEPTs. -typedef tesseract::KDPairInc PointPair; -typedef tesseract::GenericHeap PointHeap; - -#endif +/* -*-C-*- + ******************************************************************************** + * + * File: chop.h (Formerly chop.h) + * Description: + * Author: Mark Seaman, SW Productivity + * Created: Fri Oct 16 14:37:00 1987 + * Modified: Wed Jul 10 14:47:37 1991 (Mark Seaman) marks@hpgrlt + * Language: C + * Package: N/A + * Status: Reusable Software Component + * + * (c) Copyright 1987, Hewlett-Packard Company. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + *******************************************************************************/ + +#ifndef CHOP_H +#define CHOP_H + +/*---------------------------------------------------------------------- + I n c l u d e s +----------------------------------------------------------------------*/ +#include "genericheap.h" +#include "kdpair.h" +#include "seam.h" + +/*---------------------------------------------------------------------- + T y p e s +---------------------------------------------------------------------*/ +#define MAX_NUM_POINTS 50 +// The PointPair elements do NOT own the EDGEPTs. +typedef tesseract::KDPairInc PointPair; +typedef tesseract::GenericHeap PointHeap; + +#endif diff --git a/src/wordrec/drawfx.h b/src/wordrec/drawfx.h index 1a61f027dc..bf08c3b4e6 100644 --- a/src/wordrec/drawfx.h +++ b/src/wordrec/drawfx.h @@ -1,32 +1,32 @@ -/********************************************************************** - * File: drawfx.h (Formerly drawfx.h) - * Description: Draw things to do with feature extraction. - * Author: Ray Smith - * Created: Mon Jan 27 11:02:16 GMT 1992 - * - * (C) Copyright 1992, Hewlett-Packard Ltd. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - **********************************************************************/ - -#ifndef DRAWFX_H -#define DRAWFX_H - -#include "params.h" -#include "scrollview.h" - -extern STRING_VAR_H (fx_debugfile, DEBUG_WIN_NAME, "Name of debugfile"); -extern ScrollView* fx_win; -extern FILE *fx_debug; -void create_fx_win(); //make features win -void clear_fx_win(); //make features win -void create_fxdebug_win(); //make gradients win -#endif +/********************************************************************** + * File: drawfx.h (Formerly drawfx.h) + * Description: Draw things to do with feature extraction. + * Author: Ray Smith + * Created: Mon Jan 27 11:02:16 GMT 1992 + * + * (C) Copyright 1992, Hewlett-Packard Ltd. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + **********************************************************************/ + +#ifndef DRAWFX_H +#define DRAWFX_H + +#include "params.h" +#include "scrollview.h" + +extern STRING_VAR_H (fx_debugfile, DEBUG_WIN_NAME, "Name of debugfile"); +extern ScrollView* fx_win; +extern FILE *fx_debug; +void create_fx_win(); //make features win +void clear_fx_win(); //make features win +void create_fxdebug_win(); //make gradients win +#endif diff --git a/src/wordrec/findseam.h b/src/wordrec/findseam.h index bd8903c9f2..f1da0792a1 100644 --- a/src/wordrec/findseam.h +++ b/src/wordrec/findseam.h @@ -1,44 +1,44 @@ -/* -*-C-*- - ******************************************************************************** - * - * File: findseam.h (Formerly findseam.h) - * Description: - * Author: Mark Seaman, SW Productivity - * Created: Fri Oct 16 14:37:00 1987 - * Modified: Thu May 16 17:05:17 1991 (Mark Seaman) marks@hpgrlt - * Language: C - * Package: N/A - * Status: Reusable Software Component - * - * (c) Copyright 1987, Hewlett-Packard Company. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - *********************************************************************************/ - -#ifndef FINDSEAM_H -#define FINDSEAM_H - -/*---------------------------------------------------------------------- - I n c l u d e s -----------------------------------------------------------------------*/ -#include "seam.h" -#include "genericheap.h" -#include "kdpair.h" -#include "chop.h" - -// The SeamPair elements own their SEAMs and delete them upon destruction. -typedef tesseract::KDPtrPairInc SeamPair; -typedef tesseract::GenericHeap SeamQueue; - -typedef tesseract::KDPtrPairDec SeamDecPair; -typedef tesseract::GenericHeap SeamPile; - -#endif +/* -*-C-*- + ******************************************************************************** + * + * File: findseam.h (Formerly findseam.h) + * Description: + * Author: Mark Seaman, SW Productivity + * Created: Fri Oct 16 14:37:00 1987 + * Modified: Thu May 16 17:05:17 1991 (Mark Seaman) marks@hpgrlt + * Language: C + * Package: N/A + * Status: Reusable Software Component + * + * (c) Copyright 1987, Hewlett-Packard Company. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + *********************************************************************************/ + +#ifndef FINDSEAM_H +#define FINDSEAM_H + +/*---------------------------------------------------------------------- + I n c l u d e s +----------------------------------------------------------------------*/ +#include "seam.h" +#include "genericheap.h" +#include "kdpair.h" +#include "chop.h" + +// The SeamPair elements own their SEAMs and delete them upon destruction. +typedef tesseract::KDPtrPairInc SeamPair; +typedef tesseract::GenericHeap SeamQueue; + +typedef tesseract::KDPtrPairDec SeamDecPair; +typedef tesseract::GenericHeap SeamPile; + +#endif diff --git a/src/wordrec/gradechop.cpp b/src/wordrec/gradechop.cpp index 7b0701cd8d..44e331c6ec 100644 --- a/src/wordrec/gradechop.cpp +++ b/src/wordrec/gradechop.cpp @@ -1,90 +1,90 @@ -/* -*-C-*- - ******************************************************************************** - * - * File: gradechop.cpp (Formerly gradechop.c) - * Description: - * Author: Mark Seaman, OCR Technology - * Created: Fri Oct 16 14:37:00 1987 - * Modified: Tue Jul 30 16:06:27 1991 (Mark Seaman) marks@hpgrlt - * Language: C - * Package: N/A - * Status: Reusable Software Component - * - * (c) Copyright 1987, Hewlett-Packard Company. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - *********************************************************************************/ -/*---------------------------------------------------------------------- - I n c l u d e s -----------------------------------------------------------------------*/ -#include "gradechop.h" -#include "wordrec.h" -#include "chop.h" -#include "ndminx.h" -#include - -/*---------------------------------------------------------------------- - M a c r o s -----------------------------------------------------------------------*/ - -namespace tesseract { - -/*---------------------------------------------------------------------- - F u n c t i o n s -----------------------------------------------------------------------*/ - -/********************************************************************** - * grade_split_length - * - * Return a grade for the length of this split. - * 0 = "perfect" - * 100 = "no way jay" - **********************************************************************/ -PRIORITY Wordrec::grade_split_length(register SPLIT *split) { - PRIORITY grade; - float split_length; - - split_length = - split->point1->WeightedDistance(*split->point2, chop_x_y_weight); - - if (split_length <= 0) - grade = 0; - else - grade = sqrt (split_length) * chop_split_dist_knob; - - return (MAX (0.0, grade)); -} - - -/********************************************************************** - * grade_sharpness - * - * Return a grade for the sharpness of this split. - * 0 = "perfect" - * 100 = "no way jay" - **********************************************************************/ -PRIORITY Wordrec::grade_sharpness(register SPLIT *split) { - PRIORITY grade; - - grade = point_priority (split->point1) + point_priority (split->point2); - - if (grade < -360.0) - grade = 0; - else - grade += 360.0; - - grade *= chop_sharpness_knob; /* Values 0 to -360 */ - - return (grade); -} - - -} // namespace tesseract +/* -*-C-*- + ******************************************************************************** + * + * File: gradechop.cpp (Formerly gradechop.c) + * Description: + * Author: Mark Seaman, OCR Technology + * Created: Fri Oct 16 14:37:00 1987 + * Modified: Tue Jul 30 16:06:27 1991 (Mark Seaman) marks@hpgrlt + * Language: C + * Package: N/A + * Status: Reusable Software Component + * + * (c) Copyright 1987, Hewlett-Packard Company. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + *********************************************************************************/ +/*---------------------------------------------------------------------- + I n c l u d e s +----------------------------------------------------------------------*/ +#include "gradechop.h" +#include "wordrec.h" +#include "chop.h" +#include "ndminx.h" +#include + +/*---------------------------------------------------------------------- + M a c r o s +----------------------------------------------------------------------*/ + +namespace tesseract { + +/*---------------------------------------------------------------------- + F u n c t i o n s +----------------------------------------------------------------------*/ + +/********************************************************************** + * grade_split_length + * + * Return a grade for the length of this split. + * 0 = "perfect" + * 100 = "no way jay" + **********************************************************************/ +PRIORITY Wordrec::grade_split_length(register SPLIT *split) { + PRIORITY grade; + float split_length; + + split_length = + split->point1->WeightedDistance(*split->point2, chop_x_y_weight); + + if (split_length <= 0) + grade = 0; + else + grade = sqrt (split_length) * chop_split_dist_knob; + + return (MAX (0.0, grade)); +} + + +/********************************************************************** + * grade_sharpness + * + * Return a grade for the sharpness of this split. + * 0 = "perfect" + * 100 = "no way jay" + **********************************************************************/ +PRIORITY Wordrec::grade_sharpness(register SPLIT *split) { + PRIORITY grade; + + grade = point_priority (split->point1) + point_priority (split->point2); + + if (grade < -360.0) + grade = 0; + else + grade += 360.0; + + grade *= chop_sharpness_knob; /* Values 0 to -360 */ + + return (grade); +} + + +} // namespace tesseract diff --git a/src/wordrec/gradechop.h b/src/wordrec/gradechop.h index 5b86dba8f9..01e5bf2641 100644 --- a/src/wordrec/gradechop.h +++ b/src/wordrec/gradechop.h @@ -1,50 +1,50 @@ -/* -*-C-*- - ******************************************************************************** - * - * File: gradechop.h (Formerly gradechop.h) - * Description: - * Author: Mark Seaman, SW Productivity - * Created: Fri Oct 16 14:37:00 1987 - * Modified: Tue Jul 9 16:40:39 1991 (Mark Seaman) marks@hpgrlt - * Language: C - * Package: N/A - * Status: Reusable Software Component - * - * (c) Copyright 1987, Hewlett-Packard Company. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - *********************************************************************************/ - -#ifndef GRADECHOP_H -#define GRADECHOP_H - -/*---------------------------------------------------------------------- - I n c l u d e s -----------------------------------------------------------------------*/ -#include "seam.h" -#include "ndminx.h" - -/*---------------------------------------------------------------------- - M a c r o s -----------------------------------------------------------------------*/ -/********************************************************************** - * partial_split_priority - * - * Assign a priority to this split based on the features that it has. - * Grade it according to the different rating schemes and return the - * value of its goodness. - **********************************************************************/ - -#define partial_split_priority(split) \ -(grade_split_length (split) + \ - grade_sharpness (split)) \ - -#endif +/* -*-C-*- + ******************************************************************************** + * + * File: gradechop.h (Formerly gradechop.h) + * Description: + * Author: Mark Seaman, SW Productivity + * Created: Fri Oct 16 14:37:00 1987 + * Modified: Tue Jul 9 16:40:39 1991 (Mark Seaman) marks@hpgrlt + * Language: C + * Package: N/A + * Status: Reusable Software Component + * + * (c) Copyright 1987, Hewlett-Packard Company. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + *********************************************************************************/ + +#ifndef GRADECHOP_H +#define GRADECHOP_H + +/*---------------------------------------------------------------------- + I n c l u d e s +----------------------------------------------------------------------*/ +#include "seam.h" +#include "ndminx.h" + +/*---------------------------------------------------------------------- + M a c r o s +----------------------------------------------------------------------*/ +/********************************************************************** + * partial_split_priority + * + * Assign a priority to this split based on the features that it has. + * Grade it according to the different rating schemes and return the + * value of its goodness. + **********************************************************************/ + +#define partial_split_priority(split) \ +(grade_split_length (split) + \ + grade_sharpness (split)) \ + +#endif diff --git a/src/wordrec/lm_pain_points.h b/src/wordrec/lm_pain_points.h index 1966637497..0f47b1ddd0 100644 --- a/src/wordrec/lm_pain_points.h +++ b/src/wordrec/lm_pain_points.h @@ -1,138 +1,138 @@ -/////////////////////////////////////////////////////////////////////// -// File: lm_pain_points.h -// Description: Functions that utilize the knowledge about the properties -// of the paths explored by the segmentation search in order -// to generate "pain points" - the locations in the ratings -// matrix which should be classified next. -// Author: Rika Antonova -// Created: Mon Jun 20 11:26:43 PST 2012 -// -// (C) Copyright 2012, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -#ifndef TESSERACT_WORDREC_PAIN_POINTS_H_ -#define TESSERACT_WORDREC_PAIN_POINTS_H_ - -#include "associate.h" -#include "dict.h" -#include "genericheap.h" -#include "lm_state.h" - -namespace tesseract { - -// Heap of pain points used for determining where to chop/join. -typedef GenericHeap PainPointHeap; - -// Types of pain points (ordered in the decreasing level of importance). -enum LMPainPointsType { - LM_PPTYPE_BLAMER, - LM_PPTYPE_AMBIG, - LM_PPTYPE_PATH, - LM_PPTYPE_SHAPE, - - LM_PPTYPE_NUM -}; - -static const char * const LMPainPointsTypeName[] = { - "LM_PPTYPE_BLAMER", - "LM_PPTYPE_AMBIGS", - "LM_PPTYPE_PATH", - "LM_PPTYPE_SHAPE", -}; - -class LMPainPoints { - public: - - static const float kDefaultPainPointPriorityAdjustment; - // If there is a significant drop in character ngram probability or a - // dangerous ambiguity make the thresholds on what blob combinations - // can be classified looser. - static const float kLooseMaxCharWhRatio; - // Returns a description of the type of a pain point. - static const char* PainPointDescription(LMPainPointsType type) { - return LMPainPointsTypeName[type]; - } - - LMPainPoints(int max, float rat, bool fp, const Dict *d, int deb) : - max_heap_size_(max), max_char_wh_ratio_(rat), fixed_pitch_(fp), - dict_(d), debug_level_(deb) {} - ~LMPainPoints() {} - - // Returns true if the heap of pain points of pp_type is not empty(). - inline bool HasPainPoints(LMPainPointsType pp_type) const { - return !pain_points_heaps_[pp_type].empty(); - } - - // Dequeues the next pain point from the pain points queue and copies - // its contents and priority to *pp and *priority. - // Returns LM_PPTYPE_NUM if pain points queue is empty, otherwise the type. - LMPainPointsType Deque(MATRIX_COORD *pp, float *priority); - - // Clears pain points heap. - void Clear() { - for (int h = 0; h < LM_PPTYPE_NUM; ++h) pain_points_heaps_[h].clear(); - } - - // For each cell, generate a "pain point" if the cell is not classified - // and has a left or right neighbor that was classified. - void GenerateInitial(WERD_RES *word_res); - - // Generate pain points from the given path. - void GenerateFromPath(float rating_cert_scale, ViterbiStateEntry *vse, - WERD_RES *word_res); - - // Generate pain points from dangerous ambiguities in best choice. - void GenerateFromAmbigs(const DANGERR &fixpt, ViterbiStateEntry *vse, - WERD_RES *word_res); - - // Generate a pain point for the blamer. - bool GenerateForBlamer(double max_char_wh_ratio, WERD_RES *word_res, - int col, int row) { - return GeneratePainPoint(col, row, LM_PPTYPE_BLAMER, 0.0, false, - max_char_wh_ratio, word_res); - } - - // Adds a pain point to classify chunks_record->ratings(col, row). - // Returns true if a new pain point was added to an appropriate heap. - // Pain point priority is set to special_priority for pain points of - // LM_PPTYPE_AMBIG or LM_PPTYPE_PATH, for other pain points - // AssociateStats::gap_sum is used. - bool GeneratePainPoint(int col, int row, LMPainPointsType pp_type, - float special_priority, bool ok_to_extend, - float max_char_wh_ratio, - WERD_RES *word_res); - - // Adjusts the pain point coordinates to cope with expansion of the ratings - // matrix due to a split of the blob with the given index. - void RemapForSplit(int index); - - private: - // Priority queues containing pain points generated by the language model - // The priority is set by the language model components, adjustments like - // seam cost and width priority are factored into the priority. - PainPointHeap pain_points_heaps_[LM_PPTYPE_NUM]; - // Maximum number of points to keep in the heap. - int max_heap_size_; - // Maximum character width/height ratio. - float max_char_wh_ratio_; - // Set to true if fixed pitch should be assumed. - bool fixed_pitch_; - // Cached pointer to dictionary. - const Dict *dict_; - // Debug level for print statements. - int debug_level_; -}; - -} // namespace tesseract - -#endif // TESSERACT_WORDREC_PAIN_POINTS_H_ +/////////////////////////////////////////////////////////////////////// +// File: lm_pain_points.h +// Description: Functions that utilize the knowledge about the properties +// of the paths explored by the segmentation search in order +// to generate "pain points" - the locations in the ratings +// matrix which should be classified next. +// Author: Rika Antonova +// Created: Mon Jun 20 11:26:43 PST 2012 +// +// (C) Copyright 2012, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +#ifndef TESSERACT_WORDREC_PAIN_POINTS_H_ +#define TESSERACT_WORDREC_PAIN_POINTS_H_ + +#include "associate.h" +#include "dict.h" +#include "genericheap.h" +#include "lm_state.h" + +namespace tesseract { + +// Heap of pain points used for determining where to chop/join. +typedef GenericHeap PainPointHeap; + +// Types of pain points (ordered in the decreasing level of importance). +enum LMPainPointsType { + LM_PPTYPE_BLAMER, + LM_PPTYPE_AMBIG, + LM_PPTYPE_PATH, + LM_PPTYPE_SHAPE, + + LM_PPTYPE_NUM +}; + +static const char * const LMPainPointsTypeName[] = { + "LM_PPTYPE_BLAMER", + "LM_PPTYPE_AMBIGS", + "LM_PPTYPE_PATH", + "LM_PPTYPE_SHAPE", +}; + +class LMPainPoints { + public: + + static const float kDefaultPainPointPriorityAdjustment; + // If there is a significant drop in character ngram probability or a + // dangerous ambiguity make the thresholds on what blob combinations + // can be classified looser. + static const float kLooseMaxCharWhRatio; + // Returns a description of the type of a pain point. + static const char* PainPointDescription(LMPainPointsType type) { + return LMPainPointsTypeName[type]; + } + + LMPainPoints(int max, float rat, bool fp, const Dict *d, int deb) : + max_heap_size_(max), max_char_wh_ratio_(rat), fixed_pitch_(fp), + dict_(d), debug_level_(deb) {} + ~LMPainPoints() {} + + // Returns true if the heap of pain points of pp_type is not empty(). + inline bool HasPainPoints(LMPainPointsType pp_type) const { + return !pain_points_heaps_[pp_type].empty(); + } + + // Dequeues the next pain point from the pain points queue and copies + // its contents and priority to *pp and *priority. + // Returns LM_PPTYPE_NUM if pain points queue is empty, otherwise the type. + LMPainPointsType Deque(MATRIX_COORD *pp, float *priority); + + // Clears pain points heap. + void Clear() { + for (int h = 0; h < LM_PPTYPE_NUM; ++h) pain_points_heaps_[h].clear(); + } + + // For each cell, generate a "pain point" if the cell is not classified + // and has a left or right neighbor that was classified. + void GenerateInitial(WERD_RES *word_res); + + // Generate pain points from the given path. + void GenerateFromPath(float rating_cert_scale, ViterbiStateEntry *vse, + WERD_RES *word_res); + + // Generate pain points from dangerous ambiguities in best choice. + void GenerateFromAmbigs(const DANGERR &fixpt, ViterbiStateEntry *vse, + WERD_RES *word_res); + + // Generate a pain point for the blamer. + bool GenerateForBlamer(double max_char_wh_ratio, WERD_RES *word_res, + int col, int row) { + return GeneratePainPoint(col, row, LM_PPTYPE_BLAMER, 0.0, false, + max_char_wh_ratio, word_res); + } + + // Adds a pain point to classify chunks_record->ratings(col, row). + // Returns true if a new pain point was added to an appropriate heap. + // Pain point priority is set to special_priority for pain points of + // LM_PPTYPE_AMBIG or LM_PPTYPE_PATH, for other pain points + // AssociateStats::gap_sum is used. + bool GeneratePainPoint(int col, int row, LMPainPointsType pp_type, + float special_priority, bool ok_to_extend, + float max_char_wh_ratio, + WERD_RES *word_res); + + // Adjusts the pain point coordinates to cope with expansion of the ratings + // matrix due to a split of the blob with the given index. + void RemapForSplit(int index); + + private: + // Priority queues containing pain points generated by the language model + // The priority is set by the language model components, adjustments like + // seam cost and width priority are factored into the priority. + PainPointHeap pain_points_heaps_[LM_PPTYPE_NUM]; + // Maximum number of points to keep in the heap. + int max_heap_size_; + // Maximum character width/height ratio. + float max_char_wh_ratio_; + // Set to true if fixed pitch should be assumed. + bool fixed_pitch_; + // Cached pointer to dictionary. + const Dict *dict_; + // Debug level for print statements. + int debug_level_; +}; + +} // namespace tesseract + +#endif // TESSERACT_WORDREC_PAIN_POINTS_H_ diff --git a/src/wordrec/measure.h b/src/wordrec/measure.h index 4e044a0414..894938e55a 100644 --- a/src/wordrec/measure.h +++ b/src/wordrec/measure.h @@ -1,127 +1,127 @@ -/* -*-C-*- - ******************************************************************************** - * - * File: measure.h (Formerly measure.h) - * Description: Statistics for a group of single measurements - * Author: Mark Seaman, SW Productivity - * Created: Fri Oct 16 14:37:00 1987 - * Modified: Mon Apr 8 09:42:28 1991 (Mark Seaman) marks@hpgrlt - * Language: C - * Package: N/A - * Status: Reusable Software Component - * - * (c) Copyright 1987, Hewlett-Packard Company. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - ******************************************************************************** - */ - -#ifndef MEASURE_H -#define MEASURE_H - -/* ----------------------------------------------------------------------- - I n c l u d e s ----------------------------------------------------------------------- -*/ - -#include - -/* ----------------------------------------------------------------------- - T y p e s ----------------------------------------------------------------------- -*/ - -typedef struct -{ - long num_samples; - float sum_of_samples; - float sum_of_squares; -} MEASUREMENT; - -/* ----------------------------------------------------------------------- - M a c r o s ----------------------------------------------------------------------- -*/ - -/********************************************************************** - * add_sample - * - * Add one more sample to a measurement. - **********************************************************************/ - -#define ADD_SAMPLE(m, s) \ - (m.sum_of_samples += (float)(s), \ - m.sum_of_squares += (float)(s) * (float)(s), ++m.num_samples) - -/********************************************************************** - * mean - * - * Return the mean value of the measurement. - **********************************************************************/ - -#define MEAN(m) \ - ((m).num_samples ? ((float)((m).sum_of_samples / (m).num_samples)) : 0) - -/********************************************************************** - * new_measurement - * - * Initialize a record to hold a measurement of a group of individual - * samples. - **********************************************************************/ - -#define new_measurement(m) \ - ((m).num_samples = 0, (m).sum_of_samples = 0, (m).sum_of_squares = 0) - -/********************************************************************** - * number_of_samples - * - * Return the number of samples in a measurement. - **********************************************************************/ - -#define number_of_samples(m) \ -((m).num_samples) - -/********************************************************************** - * standard_deviation - * - * Return the standard deviation of the measurement. - **********************************************************************/ - -#define standard_deviation(m) \ -((float) sqrt (VARIANCE (m))) - -/********************************************************************** - * variance - * - * Return the variance of the measurement. - **********************************************************************/ - -#define VARIANCE(m) \ - (((m).num_samples > 1) \ - ? ((float)(((m).num_samples * (m).sum_of_squares - \ - (m).sum_of_samples * (m).sum_of_samples) / \ - (((m).num_samples - 1) * (m).num_samples))) \ - : 0) - -/********************************************************************** - * print_summary - * - * Summarize a MEASUREMENT record. - **********************************************************************/ - -#define print_summary(string, measure) \ - cprintf("\t%-20s \tn = %d, \tm = %4.2f, \ts = %4.2f\n ", string, \ - number_of_samples(measure), MEAN(measure), \ - standard_deviation(measure)) -#endif +/* -*-C-*- + ******************************************************************************** + * + * File: measure.h (Formerly measure.h) + * Description: Statistics for a group of single measurements + * Author: Mark Seaman, SW Productivity + * Created: Fri Oct 16 14:37:00 1987 + * Modified: Mon Apr 8 09:42:28 1991 (Mark Seaman) marks@hpgrlt + * Language: C + * Package: N/A + * Status: Reusable Software Component + * + * (c) Copyright 1987, Hewlett-Packard Company. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + ******************************************************************************** + */ + +#ifndef MEASURE_H +#define MEASURE_H + +/* +---------------------------------------------------------------------- + I n c l u d e s +---------------------------------------------------------------------- +*/ + +#include + +/* +---------------------------------------------------------------------- + T y p e s +---------------------------------------------------------------------- +*/ + +typedef struct +{ + long num_samples; + float sum_of_samples; + float sum_of_squares; +} MEASUREMENT; + +/* +---------------------------------------------------------------------- + M a c r o s +---------------------------------------------------------------------- +*/ + +/********************************************************************** + * add_sample + * + * Add one more sample to a measurement. + **********************************************************************/ + +#define ADD_SAMPLE(m, s) \ + (m.sum_of_samples += (float)(s), \ + m.sum_of_squares += (float)(s) * (float)(s), ++m.num_samples) + +/********************************************************************** + * mean + * + * Return the mean value of the measurement. + **********************************************************************/ + +#define MEAN(m) \ + ((m).num_samples ? ((float)((m).sum_of_samples / (m).num_samples)) : 0) + +/********************************************************************** + * new_measurement + * + * Initialize a record to hold a measurement of a group of individual + * samples. + **********************************************************************/ + +#define new_measurement(m) \ + ((m).num_samples = 0, (m).sum_of_samples = 0, (m).sum_of_squares = 0) + +/********************************************************************** + * number_of_samples + * + * Return the number of samples in a measurement. + **********************************************************************/ + +#define number_of_samples(m) \ +((m).num_samples) + +/********************************************************************** + * standard_deviation + * + * Return the standard deviation of the measurement. + **********************************************************************/ + +#define standard_deviation(m) \ +((float) sqrt (VARIANCE (m))) + +/********************************************************************** + * variance + * + * Return the variance of the measurement. + **********************************************************************/ + +#define VARIANCE(m) \ + (((m).num_samples > 1) \ + ? ((float)(((m).num_samples * (m).sum_of_squares - \ + (m).sum_of_samples * (m).sum_of_samples) / \ + (((m).num_samples - 1) * (m).num_samples))) \ + : 0) + +/********************************************************************** + * print_summary + * + * Summarize a MEASUREMENT record. + **********************************************************************/ + +#define print_summary(string, measure) \ + cprintf("\t%-20s \tn = %d, \tm = %4.2f, \ts = %4.2f\n ", string, \ + number_of_samples(measure), MEAN(measure), \ + standard_deviation(measure)) +#endif diff --git a/src/wordrec/outlines.h b/src/wordrec/outlines.h index f73b4fc72d..bcb675e51c 100644 --- a/src/wordrec/outlines.h +++ b/src/wordrec/outlines.h @@ -1,134 +1,134 @@ -/* -*-C-*- - ******************************************************************************** - * - * File: outlines.h (Formerly outlines.h) - * Description: Combinatorial Splitter - * Author: Mark Seaman, OCR Technology - * Created: Thu Jul 27 11:27:55 1989 - * Modified: Wed May 15 17:28:47 1991 (Mark Seaman) marks@hpgrlt - * Language: C - * Package: N/A - * Status: Experimental (Do Not Distribute) - * - * (c) Copyright 1989, Hewlett-Packard Company. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - *********************************************************************************/ -#ifndef OUTLINES_H -#define OUTLINES_H - -#include "blobs.h" -#include "chop.h" - -#include - -/*---------------------------------------------------------------------- - C o n s t a n t s -----------------------------------------------------------------------*/ -#define LARGE_DISTANCE 100000 /* Used for closest dist */ -#define MIN_BLOB_SIZE 10 /* Big units */ -#define MAX_ASPECT_RATIO 2.5 /* Widest character */ - -/*---------------------------------------------------------------------- - M a c r o s -----------------------------------------------------------------------*/ -/********************************************************************** - * same_point - * - * Return TRUE if the point values are the same. The parameters must - * be of type POINT. - **********************************************************************/ -#define same_point(p1,p2) \ - ((abs (p1.x - p2.x) < chop_same_distance) && \ - (abs (p1.y - p2.y) < chop_same_distance)) - -/********************************************************************** - * dist_square - * - * Return the square of the distance between these two points. The - * parameters must be of type POINT. - **********************************************************************/ - -#define dist_square(p1,p2) \ - ((p2.x - p1.x) * (p2.x - p1.x) + \ - (p2.y - p1.y) * (p2.y - p1.y)) - -/********************************************************************** - * closest - * - * The expression provides the EDGEPT that is closest to the point in - * question. All three parameters must be of type EDGEPT. - **********************************************************************/ - -#define closest(test_p,p1,p2) \ -(p1 ? \ - (p2 ? \ - ((dist_square (test_p->pos, p1->pos) < \ - dist_square (test_p->pos, p2->pos)) ? \ - p1 : \ - p2) : \ - p1) : \ - p2) - -/********************************************************************** - * edgept_dist - * - * Return the distance (squared) between the two edge points. - **********************************************************************/ - -#define edgept_dist(p1,p2) \ -(dist_square ((p1)->pos, (p2)->pos)) - -/********************************************************************** - * is_exterior_point - * - * Return TRUE if the point supplied is an exterior projection from the - * outline. - **********************************************************************/ - -#define is_exterior_point(edge,point) \ -(same_point (edge->prev->pos, point->pos) || \ - same_point (edge->next->pos, point->pos) || \ - (angle_change (edge->prev, edge, edge->next) - \ - angle_change (edge->prev, edge, point) > 20)) - -/********************************************************************** - * is_equal - * - * Return TRUE if the POINTs are equal. - **********************************************************************/ - -#define is_equal(p1,p2) \ -(((p1).x == (p2).x) && ((p1).y == (p2).y)) - -/********************************************************************** - * is_on_line - * - * Return TRUE if the point is on the line segment between the two end - * points. The two end points are included as part of the line. The - * parameters must be of type POINT. - **********************************************************************/ - -#define is_on_line(p,p0,p1) \ - (within_range ((p).x, (p0).x, (p1).x) && \ - within_range ((p).y, (p0).y, (p1).y)) - -/********************************************************************** - * within_range - * - * Return TRUE if the first number is in between the second two numbers. - * Return FALSE otherwise. - **********************************************************************/ - -#define within_range(x,x0,x1) \ - (((x0 <= x) && (x <= x1)) || ((x1 <= x) && (x <= x0))) - -#endif +/* -*-C-*- + ******************************************************************************** + * + * File: outlines.h (Formerly outlines.h) + * Description: Combinatorial Splitter + * Author: Mark Seaman, OCR Technology + * Created: Thu Jul 27 11:27:55 1989 + * Modified: Wed May 15 17:28:47 1991 (Mark Seaman) marks@hpgrlt + * Language: C + * Package: N/A + * Status: Experimental (Do Not Distribute) + * + * (c) Copyright 1989, Hewlett-Packard Company. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + *********************************************************************************/ +#ifndef OUTLINES_H +#define OUTLINES_H + +#include "blobs.h" +#include "chop.h" + +#include + +/*---------------------------------------------------------------------- + C o n s t a n t s +----------------------------------------------------------------------*/ +#define LARGE_DISTANCE 100000 /* Used for closest dist */ +#define MIN_BLOB_SIZE 10 /* Big units */ +#define MAX_ASPECT_RATIO 2.5 /* Widest character */ + +/*---------------------------------------------------------------------- + M a c r o s +----------------------------------------------------------------------*/ +/********************************************************************** + * same_point + * + * Return TRUE if the point values are the same. The parameters must + * be of type POINT. + **********************************************************************/ +#define same_point(p1,p2) \ + ((abs (p1.x - p2.x) < chop_same_distance) && \ + (abs (p1.y - p2.y) < chop_same_distance)) + +/********************************************************************** + * dist_square + * + * Return the square of the distance between these two points. The + * parameters must be of type POINT. + **********************************************************************/ + +#define dist_square(p1,p2) \ + ((p2.x - p1.x) * (p2.x - p1.x) + \ + (p2.y - p1.y) * (p2.y - p1.y)) + +/********************************************************************** + * closest + * + * The expression provides the EDGEPT that is closest to the point in + * question. All three parameters must be of type EDGEPT. + **********************************************************************/ + +#define closest(test_p,p1,p2) \ +(p1 ? \ + (p2 ? \ + ((dist_square (test_p->pos, p1->pos) < \ + dist_square (test_p->pos, p2->pos)) ? \ + p1 : \ + p2) : \ + p1) : \ + p2) + +/********************************************************************** + * edgept_dist + * + * Return the distance (squared) between the two edge points. + **********************************************************************/ + +#define edgept_dist(p1,p2) \ +(dist_square ((p1)->pos, (p2)->pos)) + +/********************************************************************** + * is_exterior_point + * + * Return TRUE if the point supplied is an exterior projection from the + * outline. + **********************************************************************/ + +#define is_exterior_point(edge,point) \ +(same_point (edge->prev->pos, point->pos) || \ + same_point (edge->next->pos, point->pos) || \ + (angle_change (edge->prev, edge, edge->next) - \ + angle_change (edge->prev, edge, point) > 20)) + +/********************************************************************** + * is_equal + * + * Return TRUE if the POINTs are equal. + **********************************************************************/ + +#define is_equal(p1,p2) \ +(((p1).x == (p2).x) && ((p1).y == (p2).y)) + +/********************************************************************** + * is_on_line + * + * Return TRUE if the point is on the line segment between the two end + * points. The two end points are included as part of the line. The + * parameters must be of type POINT. + **********************************************************************/ + +#define is_on_line(p,p0,p1) \ + (within_range ((p).x, (p0).x, (p1).x) && \ + within_range ((p).y, (p0).y, (p1).y)) + +/********************************************************************** + * within_range + * + * Return TRUE if the first number is in between the second two numbers. + * Return FALSE otherwise. + **********************************************************************/ + +#define within_range(x,x0,x1) \ + (((x0 <= x) && (x <= x1)) || ((x1 <= x) && (x <= x0))) + +#endif diff --git a/src/wordrec/params_model.cpp b/src/wordrec/params_model.cpp index cb9ca15225..727b657b4e 100644 --- a/src/wordrec/params_model.cpp +++ b/src/wordrec/params_model.cpp @@ -1,171 +1,171 @@ -/////////////////////////////////////////////////////////////////////// -// File: params_model.cpp -// Description: Trained language model parameters. -// Author: David Eger -// Created: Mon Jun 11 11:26:42 PDT 2012 -// -// (C) Copyright 2012, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -#include "params_model.h" - -#include -#include -#include - -#include "bitvector.h" -#include "tprintf.h" - -namespace tesseract { - -// Scale factor to apply to params model scores. -static const float kScoreScaleFactor = 100.0f; -// Minimum cost result to return. -static const float kMinFinalCost = 0.001f; -// Maximum cost result to return. -static const float kMaxFinalCost = 100.0f; - -void ParamsModel::Print() { - for (int p = 0; p < PTRAIN_NUM_PASSES; ++p) { - tprintf("ParamsModel for pass %d lang %s\n", p, lang_.string()); - for (int i = 0; i < weights_vec_[p].size(); ++i) { - tprintf("%s = %g\n", kParamsTrainingFeatureTypeName[i], - weights_vec_[p][i]); - } - } -} - -void ParamsModel::Copy(const ParamsModel &other_model) { - for (int p = 0; p < PTRAIN_NUM_PASSES; ++p) { - weights_vec_[p] = other_model.weights_for_pass( - static_cast(p)); - } -} - -// Given a (modifiable) line, parse out a key / value pair. -// Return true on success. -bool ParamsModel::ParseLine(char *line, char** key, float *val) { - if (line[0] == '#') - return false; - int end_of_key = 0; - while (line[end_of_key] && !isspace(line[end_of_key])) end_of_key++; - if (!line[end_of_key]) { - tprintf("ParamsModel::Incomplete line %s\n", line); - return false; - } - line[end_of_key++] = 0; - *key = line; - if (sscanf(line + end_of_key, " %f", val) != 1) - return false; - return true; -} - -// Applies params model weights to the given features. -// Assumes that features is an array of size PTRAIN_NUM_FEATURE_TYPES. -// The cost is set to a number that can be multiplied by the outline length, -// as with the old ratings scheme. This enables words of different length -// and combinations of words to be compared meaningfully. -float ParamsModel::ComputeCost(const float features[]) const { - float unnorm_score = 0.0; - for (int f = 0; f < PTRAIN_NUM_FEATURE_TYPES; ++f) { - unnorm_score += weights_vec_[pass_][f] * features[f]; - } - return ClipToRange(-unnorm_score / kScoreScaleFactor, - kMinFinalCost, kMaxFinalCost); -} - -bool ParamsModel::Equivalent(const ParamsModel &that) const { - float epsilon = 0.0001; - for (int p = 0; p < PTRAIN_NUM_PASSES; ++p) { - if (weights_vec_[p].size() != that.weights_vec_[p].size()) return false; - for (int i = 0; i < weights_vec_[p].size(); i++) { - if (weights_vec_[p][i] != that.weights_vec_[p][i] && - fabs(weights_vec_[p][i] - that.weights_vec_[p][i]) > epsilon) - return false; - } - } - return true; -} - -bool ParamsModel::LoadFromFile( - const char *lang, - const char *full_path) { - TFile fp; - if (!fp.Open(full_path, nullptr)) { - tprintf("Error opening file %s\n", full_path); - return false; - } - return LoadFromFp(lang, &fp); -} - -bool ParamsModel::LoadFromFp(const char *lang, TFile *fp) { - const int kMaxLineSize = 100; - char line[kMaxLineSize]; - BitVector present; - present.Init(PTRAIN_NUM_FEATURE_TYPES); - lang_ = lang; - // Load weights for passes with adaption on. - GenericVector &weights = weights_vec_[pass_]; - weights.init_to_size(PTRAIN_NUM_FEATURE_TYPES, 0.0); - - while (fp->FGets(line, kMaxLineSize) != nullptr) { - char *key = nullptr; - float value; - if (!ParseLine(line, &key, &value)) - continue; - int idx = ParamsTrainingFeatureByName(key); - if (idx < 0) { - tprintf("ParamsModel::Unknown parameter %s\n", key); - continue; - } - if (!present[idx]) { - present.SetValue(idx, true); - } - weights[idx] = value; - } - bool complete = (present.NumSetBits() == PTRAIN_NUM_FEATURE_TYPES); - if (!complete) { - for (int i = 0; i < PTRAIN_NUM_FEATURE_TYPES; i++) { - if (!present[i]) { - tprintf("Missing field %s.\n", kParamsTrainingFeatureTypeName[i]); - } - } - lang_ = ""; - weights.truncate(0); - } - return complete; -} - -bool ParamsModel::SaveToFile(const char *full_path) const { - const GenericVector &weights = weights_vec_[pass_]; - if (weights.size() != PTRAIN_NUM_FEATURE_TYPES) { - tprintf("Refusing to save ParamsModel that has not been initialized.\n"); - return false; - } - FILE *fp = fopen(full_path, "wb"); - if (!fp) { - tprintf("Could not open %s for writing.\n", full_path); - return false; - } - bool all_good = true; - for (int i = 0; i < weights.size(); i++) { - if (fprintf(fp, "%s %f\n", kParamsTrainingFeatureTypeName[i], weights[i]) - < 0) { - all_good = false; - } - } - fclose(fp); - return all_good; -} - -} // namespace tesseract +/////////////////////////////////////////////////////////////////////// +// File: params_model.cpp +// Description: Trained language model parameters. +// Author: David Eger +// Created: Mon Jun 11 11:26:42 PDT 2012 +// +// (C) Copyright 2012, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +#include "params_model.h" + +#include +#include +#include + +#include "bitvector.h" +#include "tprintf.h" + +namespace tesseract { + +// Scale factor to apply to params model scores. +static const float kScoreScaleFactor = 100.0f; +// Minimum cost result to return. +static const float kMinFinalCost = 0.001f; +// Maximum cost result to return. +static const float kMaxFinalCost = 100.0f; + +void ParamsModel::Print() { + for (int p = 0; p < PTRAIN_NUM_PASSES; ++p) { + tprintf("ParamsModel for pass %d lang %s\n", p, lang_.string()); + for (int i = 0; i < weights_vec_[p].size(); ++i) { + tprintf("%s = %g\n", kParamsTrainingFeatureTypeName[i], + weights_vec_[p][i]); + } + } +} + +void ParamsModel::Copy(const ParamsModel &other_model) { + for (int p = 0; p < PTRAIN_NUM_PASSES; ++p) { + weights_vec_[p] = other_model.weights_for_pass( + static_cast(p)); + } +} + +// Given a (modifiable) line, parse out a key / value pair. +// Return true on success. +bool ParamsModel::ParseLine(char *line, char** key, float *val) { + if (line[0] == '#') + return false; + int end_of_key = 0; + while (line[end_of_key] && !isspace(line[end_of_key])) end_of_key++; + if (!line[end_of_key]) { + tprintf("ParamsModel::Incomplete line %s\n", line); + return false; + } + line[end_of_key++] = 0; + *key = line; + if (sscanf(line + end_of_key, " %f", val) != 1) + return false; + return true; +} + +// Applies params model weights to the given features. +// Assumes that features is an array of size PTRAIN_NUM_FEATURE_TYPES. +// The cost is set to a number that can be multiplied by the outline length, +// as with the old ratings scheme. This enables words of different length +// and combinations of words to be compared meaningfully. +float ParamsModel::ComputeCost(const float features[]) const { + float unnorm_score = 0.0; + for (int f = 0; f < PTRAIN_NUM_FEATURE_TYPES; ++f) { + unnorm_score += weights_vec_[pass_][f] * features[f]; + } + return ClipToRange(-unnorm_score / kScoreScaleFactor, + kMinFinalCost, kMaxFinalCost); +} + +bool ParamsModel::Equivalent(const ParamsModel &that) const { + float epsilon = 0.0001; + for (int p = 0; p < PTRAIN_NUM_PASSES; ++p) { + if (weights_vec_[p].size() != that.weights_vec_[p].size()) return false; + for (int i = 0; i < weights_vec_[p].size(); i++) { + if (weights_vec_[p][i] != that.weights_vec_[p][i] && + fabs(weights_vec_[p][i] - that.weights_vec_[p][i]) > epsilon) + return false; + } + } + return true; +} + +bool ParamsModel::LoadFromFile( + const char *lang, + const char *full_path) { + TFile fp; + if (!fp.Open(full_path, nullptr)) { + tprintf("Error opening file %s\n", full_path); + return false; + } + return LoadFromFp(lang, &fp); +} + +bool ParamsModel::LoadFromFp(const char *lang, TFile *fp) { + const int kMaxLineSize = 100; + char line[kMaxLineSize]; + BitVector present; + present.Init(PTRAIN_NUM_FEATURE_TYPES); + lang_ = lang; + // Load weights for passes with adaption on. + GenericVector &weights = weights_vec_[pass_]; + weights.init_to_size(PTRAIN_NUM_FEATURE_TYPES, 0.0); + + while (fp->FGets(line, kMaxLineSize) != nullptr) { + char *key = nullptr; + float value; + if (!ParseLine(line, &key, &value)) + continue; + int idx = ParamsTrainingFeatureByName(key); + if (idx < 0) { + tprintf("ParamsModel::Unknown parameter %s\n", key); + continue; + } + if (!present[idx]) { + present.SetValue(idx, true); + } + weights[idx] = value; + } + bool complete = (present.NumSetBits() == PTRAIN_NUM_FEATURE_TYPES); + if (!complete) { + for (int i = 0; i < PTRAIN_NUM_FEATURE_TYPES; i++) { + if (!present[i]) { + tprintf("Missing field %s.\n", kParamsTrainingFeatureTypeName[i]); + } + } + lang_ = ""; + weights.truncate(0); + } + return complete; +} + +bool ParamsModel::SaveToFile(const char *full_path) const { + const GenericVector &weights = weights_vec_[pass_]; + if (weights.size() != PTRAIN_NUM_FEATURE_TYPES) { + tprintf("Refusing to save ParamsModel that has not been initialized.\n"); + return false; + } + FILE *fp = fopen(full_path, "wb"); + if (!fp) { + tprintf("Could not open %s for writing.\n", full_path); + return false; + } + bool all_good = true; + for (int i = 0; i < weights.size(); i++) { + if (fprintf(fp, "%s %f\n", kParamsTrainingFeatureTypeName[i], weights[i]) + < 0) { + all_good = false; + } + } + fclose(fp); + return all_good; +} + +} // namespace tesseract diff --git a/src/wordrec/params_model.h b/src/wordrec/params_model.h index 158c16717a..df48d5bd91 100644 --- a/src/wordrec/params_model.h +++ b/src/wordrec/params_model.h @@ -1,89 +1,89 @@ -/////////////////////////////////////////////////////////////////////// -// File: params_model.h -// Description: Trained feature serialization for language parameter training. -// Author: David Eger -// Created: Mon Jun 11 11:26:42 PDT 2012 -// -// (C) Copyright 2011, Google Inc. -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -/////////////////////////////////////////////////////////////////////// - -#ifndef TESSERACT_WORDREC_PARAMS_MODEL_H_ -#define TESSERACT_WORDREC_PARAMS_MODEL_H_ - -#include "params_training_featdef.h" -#include "ratngs.h" -#include "strngs.h" - -namespace tesseract { - -// Represents the learned weights for a given language. -class ParamsModel { - public: - // Enum for expressing OCR pass. - enum PassEnum { - PTRAIN_PASS1, - PTRAIN_PASS2, - - PTRAIN_NUM_PASSES - }; - - ParamsModel() : pass_(PTRAIN_PASS1) {} - ParamsModel(const char *lang, const GenericVector &weights) : - lang_(lang), pass_(PTRAIN_PASS1) { weights_vec_[pass_] = weights; } - inline bool Initialized() { - return weights_vec_[pass_].size() == PTRAIN_NUM_FEATURE_TYPES; - } - // Prints out feature weights. - void Print(); - // Clears weights for all passes. - void Clear() { - for (int p = 0; p < PTRAIN_NUM_PASSES; ++p) weights_vec_[p].clear(); - } - // Copies the weights of the given params model. - void Copy(const ParamsModel &other_model); - // Applies params model weights to the given features. - // Assumes that features is an array of size PTRAIN_NUM_FEATURE_TYPES. - float ComputeCost(const float features[]) const; - bool Equivalent(const ParamsModel &that) const; - - // Returns true on success. - bool SaveToFile(const char *full_path) const; - - // Returns true on success. - bool LoadFromFile(const char *lang, const char *full_path); - bool LoadFromFp(const char *lang, TFile *fp); - - const GenericVector& weights() const { - return weights_vec_[pass_]; - } - const GenericVector& weights_for_pass(PassEnum pass) const { - return weights_vec_[pass]; - } - void SetPass(PassEnum pass) { pass_ = pass; } - - private: - bool ParseLine(char *line, char **key, float *val); - - STRING lang_; - // Set to the current pass type and used to determine which set of weights - // should be used for ComputeCost() and other functions. - PassEnum pass_; - // Several sets of weights for various OCR passes (e.g. pass1 with adaption, - // pass2 without adaption, etc). - GenericVector weights_vec_[PTRAIN_NUM_PASSES]; -}; - -} // namespace tesseract - -#endif // TESSERACT_WORDREC_PARAMS_MODEL_H_ - +/////////////////////////////////////////////////////////////////////// +// File: params_model.h +// Description: Trained feature serialization for language parameter training. +// Author: David Eger +// Created: Mon Jun 11 11:26:42 PDT 2012 +// +// (C) Copyright 2011, Google Inc. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +/////////////////////////////////////////////////////////////////////// + +#ifndef TESSERACT_WORDREC_PARAMS_MODEL_H_ +#define TESSERACT_WORDREC_PARAMS_MODEL_H_ + +#include "params_training_featdef.h" +#include "ratngs.h" +#include "strngs.h" + +namespace tesseract { + +// Represents the learned weights for a given language. +class ParamsModel { + public: + // Enum for expressing OCR pass. + enum PassEnum { + PTRAIN_PASS1, + PTRAIN_PASS2, + + PTRAIN_NUM_PASSES + }; + + ParamsModel() : pass_(PTRAIN_PASS1) {} + ParamsModel(const char *lang, const GenericVector &weights) : + lang_(lang), pass_(PTRAIN_PASS1) { weights_vec_[pass_] = weights; } + inline bool Initialized() { + return weights_vec_[pass_].size() == PTRAIN_NUM_FEATURE_TYPES; + } + // Prints out feature weights. + void Print(); + // Clears weights for all passes. + void Clear() { + for (int p = 0; p < PTRAIN_NUM_PASSES; ++p) weights_vec_[p].clear(); + } + // Copies the weights of the given params model. + void Copy(const ParamsModel &other_model); + // Applies params model weights to the given features. + // Assumes that features is an array of size PTRAIN_NUM_FEATURE_TYPES. + float ComputeCost(const float features[]) const; + bool Equivalent(const ParamsModel &that) const; + + // Returns true on success. + bool SaveToFile(const char *full_path) const; + + // Returns true on success. + bool LoadFromFile(const char *lang, const char *full_path); + bool LoadFromFp(const char *lang, TFile *fp); + + const GenericVector& weights() const { + return weights_vec_[pass_]; + } + const GenericVector& weights_for_pass(PassEnum pass) const { + return weights_vec_[pass]; + } + void SetPass(PassEnum pass) { pass_ = pass; } + + private: + bool ParseLine(char *line, char **key, float *val); + + STRING lang_; + // Set to the current pass type and used to determine which set of weights + // should be used for ComputeCost() and other functions. + PassEnum pass_; + // Several sets of weights for various OCR passes (e.g. pass1 with adaption, + // pass2 without adaption, etc). + GenericVector weights_vec_[PTRAIN_NUM_PASSES]; +}; + +} // namespace tesseract + +#endif // TESSERACT_WORDREC_PARAMS_MODEL_H_ + diff --git a/src/wordrec/plotedges.h b/src/wordrec/plotedges.h index 9f331760cf..91521de734 100644 --- a/src/wordrec/plotedges.h +++ b/src/wordrec/plotedges.h @@ -1,69 +1,69 @@ -/* -*-C-*- - ******************************************************************************** - * - * File: plotedges.h (Formerly plotedges.h) - * Description: Convert the various data type into line lists - * Author: Mark Seaman, OCR Technology - * Created: Fri Jul 28 13:14:48 1989 - * Modified: Mon May 13 09:34:51 1991 (Mark Seaman) marks@hpgrlt - * Language: C - * Package: N/A - * Status: Experimental (Do Not Distribute) - * - * (c) Copyright 1989, Hewlett-Packard Company. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - *********************************************************************************/ -#ifndef PLOTEDGES_H -#define PLOTEDGES_H - -#include "callcpp.h" -#include "oldlist.h" -#include "blobs.h" - -/*---------------------------------------------------------------------- - V a r i a b l e s -----------------------------------------------------------------------*/ -extern ScrollView *edge_window; /* Window for edges */ - -/*---------------------------------------------------------------------- - Macros -----------------------------------------------------------------------*/ -/********************************************************************** - * update_edge_window - * - * Refresh the display of the edge window. - **********************************************************************/ -#define update_edge_window() \ -if (wordrec_display_splits) { \ - c_make_current (edge_window); \ -} \ - - -/********************************************************************** - * edge_window_wait - * - * Wait for someone to click in the edges window. - **********************************************************************/ - -#define edge_window_wait() \ -if (wordrec_display_splits) window_wait (edge_window) - -/*---------------------------------------------------------------------- - F u n c t i o n s ----------------------------------------------------------------------*/ -void display_edgepts(LIST outlines); - -void draw_blob_edges(TBLOB *blob); - -void mark_outline(EDGEPT *edgept); - -#endif +/* -*-C-*- + ******************************************************************************** + * + * File: plotedges.h (Formerly plotedges.h) + * Description: Convert the various data type into line lists + * Author: Mark Seaman, OCR Technology + * Created: Fri Jul 28 13:14:48 1989 + * Modified: Mon May 13 09:34:51 1991 (Mark Seaman) marks@hpgrlt + * Language: C + * Package: N/A + * Status: Experimental (Do Not Distribute) + * + * (c) Copyright 1989, Hewlett-Packard Company. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + *********************************************************************************/ +#ifndef PLOTEDGES_H +#define PLOTEDGES_H + +#include "callcpp.h" +#include "oldlist.h" +#include "blobs.h" + +/*---------------------------------------------------------------------- + V a r i a b l e s +----------------------------------------------------------------------*/ +extern ScrollView *edge_window; /* Window for edges */ + +/*---------------------------------------------------------------------- + Macros +----------------------------------------------------------------------*/ +/********************************************************************** + * update_edge_window + * + * Refresh the display of the edge window. + **********************************************************************/ +#define update_edge_window() \ +if (wordrec_display_splits) { \ + c_make_current (edge_window); \ +} \ + + +/********************************************************************** + * edge_window_wait + * + * Wait for someone to click in the edges window. + **********************************************************************/ + +#define edge_window_wait() \ +if (wordrec_display_splits) window_wait (edge_window) + +/*---------------------------------------------------------------------- + F u n c t i o n s +---------------------------------------------------------------------*/ +void display_edgepts(LIST outlines); + +void draw_blob_edges(TBLOB *blob); + +void mark_outline(EDGEPT *edgept); + +#endif diff --git a/src/wordrec/render.h b/src/wordrec/render.h index 65aa61318b..3faa398d42 100644 --- a/src/wordrec/render.h +++ b/src/wordrec/render.h @@ -1,59 +1,59 @@ -/* -*-C-*- - ******************************************************************************** - * - * File: render.h (Formerly render.h) - * Description: Convert the various data type into line lists - * Author: Mark Seaman, OCR Technology - * Created: Fri Jul 28 13:14:48 1989 - * Modified: Fri Apr 26 09:59:45 1991 (Mark Seaman) marks@hpgrlt - * Language: C - * Package: N/A - * Status: Experimental (Do Not Distribute) - * - * (c) Copyright 1989, Hewlett-Packard Company. - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** http://www.apache.org/licenses/LICENSE-2.0 - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - * - *********************************************************************************/ -#ifndef RENDER_H -#define RENDER_H - -#include "host.h" -#include "callcpp.h" -#include "blobs.h" - -/*---------------------------------------------------------------------- - V a r i a b l e s -----------------------------------------------------------------------*/ -extern ScrollView *blob_window; /* Window for blobs */ -extern C_COL color_list[]; /* Colors for outlines */ - -extern BOOL_VAR_H(wordrec_display_all_blobs, 0, "Display Blobs"); - -extern BOOL_VAR_H(wordrec_display_all_words, 0, "Display Words"); - -extern BOOL_VAR_H(wordrec_blob_pause, 0, "Blob pause"); - -#define NUM_COLORS 6 - -/*---------------------------------------------------------------------- - F u n c t i o n s -----------------------------------------------------------------------*/ -void display_blob(TBLOB *blob, C_COL color); - -void render_blob(void *window, TBLOB *blob, C_COL color); - -void render_edgepts(void *window, EDGEPT *edgept, C_COL color); - -void render_outline(void *window, - TESSLINE *outline, - C_COL color); - -#endif +/* -*-C-*- + ******************************************************************************** + * + * File: render.h (Formerly render.h) + * Description: Convert the various data type into line lists + * Author: Mark Seaman, OCR Technology + * Created: Fri Jul 28 13:14:48 1989 + * Modified: Fri Apr 26 09:59:45 1991 (Mark Seaman) marks@hpgrlt + * Language: C + * Package: N/A + * Status: Experimental (Do Not Distribute) + * + * (c) Copyright 1989, Hewlett-Packard Company. + ** Licensed under the Apache License, Version 2.0 (the "License"); + ** you may not use this file except in compliance with the License. + ** You may obtain a copy of the License at + ** http://www.apache.org/licenses/LICENSE-2.0 + ** Unless required by applicable law or agreed to in writing, software + ** distributed under the License is distributed on an "AS IS" BASIS, + ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ** See the License for the specific language governing permissions and + ** limitations under the License. + * + *********************************************************************************/ +#ifndef RENDER_H +#define RENDER_H + +#include "host.h" +#include "callcpp.h" +#include "blobs.h" + +/*---------------------------------------------------------------------- + V a r i a b l e s +----------------------------------------------------------------------*/ +extern ScrollView *blob_window; /* Window for blobs */ +extern C_COL color_list[]; /* Colors for outlines */ + +extern BOOL_VAR_H(wordrec_display_all_blobs, 0, "Display Blobs"); + +extern BOOL_VAR_H(wordrec_display_all_words, 0, "Display Words"); + +extern BOOL_VAR_H(wordrec_blob_pause, 0, "Blob pause"); + +#define NUM_COLORS 6 + +/*---------------------------------------------------------------------- + F u n c t i o n s +----------------------------------------------------------------------*/ +void display_blob(TBLOB *blob, C_COL color); + +void render_blob(void *window, TBLOB *blob, C_COL color); + +void render_edgepts(void *window, EDGEPT *edgept, C_COL color); + +void render_outline(void *window, + TESSLINE *outline, + C_COL color); + +#endif